Sqlite子查询:在一个大查询中还是在for循环中?

时间:2009-06-16 07:18:50

标签: performance sqlite subquery

我计划对此进行基准测试,但由于这是很多工作,我想检查一下我之前是否没有错过任何明显的答案。

我有一个巨大的查询,通过子查询获取每行的更多详细信息。

然后在ListAdapter中使用每一行插入ListView,因此另一个循环逐行取每行以使其成为ListItem。

您认为哪种方式更有效:

  • 将子查询保存在SQL混乱中,依靠SQL引擎进行优化。
  • 取出ListAdapter循环中的子查询,所以我们懒得加载显示的细节:更具可读性,但我担心太多的打击会减慢这个过程。

两件重要的事情:

  • 我无法重写大SQL块来摆脱子查询。我知道会更好,但我没有这样做。
  • 据我所知,列表不会包含超过1000个项目,而且它是桌面应用程序,因此没有并发性。在这种情况下,这是否与关心perf有关?如果没有,我仍然对高速交通网站的回答感兴趣。很高兴知道......

2 个答案:

答案 0 :(得分:2)

SQlite是一个令人惊讶的好小引擎,但它并不是真正关于额外的聪明优化,我不会真正考虑它为“高流量网站”。一个很大的优点(对于其限制内的用途)是它可以在进程中运行,因此与一个大查询相比,多个查询的开销非常小;如果这是最简单的代码,对于您的特定用例,我会真的考虑它(并且以“延迟加载”的方式进行,正如您提示的那样,实际上可能会使第一个数据屏幕看起来更快!)。正如您所怀疑的那样,在您的使用案例中,这不太可能是性能瓶颈,因此更简单,更可靠的编码是一个重要的优势。

如果我正在进行高流量网站,并使用更丰富,更“重”的引擎,如PosgtreSQL,Oracle,SQL Server或DB2,我会更信任优化器。然而,我注意到的一件事是,我经常(唉,并非总是)将子查询更改为连接,这往往会提高性能(连接使优化器更容易使用好的索引,我认为 - - 我自己从来没有编写过SQL优化器,但这是我从许多引擎中查看查询执行计划以获得其他形式的查询的印象......当然,这会假设你有很好的索引! - ) - 这个必须用特定案例的基准确认,但这将是我最初的工作假设。

答案 1 :(得分:1)

使用游标怎么样?

我更喜欢使用大查询,让我的SQL引擎优化我的查询。 另外,我想不出一个例子,在SQL之外做一个循环而不是使用“大”查询或使用游标更好。

但知道什么更好的最好方法是对其进行基准测试。

祝你好运!