【问题标题】:Sqlite subqueries : in one big query or in a for loop?Sqlite 子查询:在一个大查询中还是在 for 循环中?
【发布时间】:2009-06-16 07:18:49
【问题描述】:

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

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

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

你觉得哪个更有效率:

  • 将子查询保留在 SQL 混乱中,依靠 SQL 引擎进行优化。
  • 取出 ListAdapter 循环中的子查询,因此我们延迟加载显示的详细信息:可读性更高,但我担心点击次数过多会减慢进程。

两件重要的事情:

  • 我无法重写大 SQL 块来删除子查询。我知道这样会更好,但我没有这样做。
  • 据我所知,一个列表不会包含超过 1000 个项目,而且它是一个桌面应用程序,因此没有并发性。在这种情况下,这甚至与关心性能有关吗?如果没有,无论如何,我仍然会对高流量网站的答案感兴趣。很高兴知道...

【问题讨论】:

    标签: performance sqlite subquery


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如何使用游标?

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

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

      祝你好运!

      【讨论】:

      • 我已经在使用 cursor,但我没有意识到它可以解决部分问题。 :-)
      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2023-03-07
      相关资源
      最近更新 更多