SQLite自动优化

SQLite自动优化,sqlite,optimization,Sqlite,Optimization,我想知道:SQLite中自动查询优化的状态是什么? 我对这个老问题特别震惊(我在寻找其他东西时偶然发现): 正如您所读到的,该查询生成笛卡尔乘积。如果根本不存在查询规划器或优化,这肯定是正确的。 但在我看来,这似乎是一个应该触发自动优化的案例,至少序列化ANDs子句,如果没有其他事情的话(正如对该问题的一个答复建议手动执行) 我可能过于乐观的理解是,DB查询优化技术离编译器优化技术并不远(=自动完成大多数更明显的优化工作) 但是事情的真实状态是什么呢 问题不仅仅是为了满足好奇心,而是因为我有一

我想知道:SQLite中自动查询优化的状态是什么? 我对这个老问题特别震惊(我在寻找其他东西时偶然发现):

正如您所读到的,该查询生成笛卡尔乘积。如果根本不存在查询规划器或优化,这肯定是正确的。 但在我看来,这似乎是一个应该触发自动优化的案例,至少序列化ANDs子句,如果没有其他事情的话(正如对该问题的一个答复建议手动执行)

我可能过于乐观的理解是,DB查询优化技术离编译器优化技术并不远(=自动完成大多数更明显的优化工作)

但是事情的真实状态是什么呢

问题不仅仅是为了满足好奇心,而是因为我有一个C++程序,它与SQLite DB进行交互,而且查询的数量与这个问题中的查询没有太大的不同,如果我发现我需要做手动的微不足道的优化,我会非常震惊。p> 谢谢

编辑:要回答关于以下带有“无”名称的“马”的评论的更多信息,这是我自己的程序中的一个查询示例:

SELECT * FROM forum_topic Topic, user AutoreTopic, forum_post LastPost, user AutoreLastPost  
WHERE (Topic.ForumTopic__subforum_C9_id = 1) AND
      (Topic.ForumTopic__author_C0_id = AutoreTopic.C0_id) AND
      ((LastPost.ForumPost__topic_last_post_C15_id = Topic.C15_id) AND
      (LastPost.ForumPost__author_C0_id = AutoreLastPost.C0_id)) ORDER BY
 LastPost.C16_id DESC  LIMIT 4 OFFSET 0;

现在,这将生成所有4个表的笛卡尔乘积,然后对条件进行求值,还是查询计划器将序列化4个ANDs子句,然后才进行笛卡尔乘积(使用创建的子集,这可能更有效)?

链接问题中的查询毫无意义,由此产生的笛卡尔积很可能不是最初的意图。我不明白DBMS应该如何(以及为什么)对@a_horse_和_no_name进行“优化”:撇开具体查询的细节不谈:假设它是来自4个不同表的4个不同列。optmizer会只对表进行笛卡尔积还是序列化ANDs子句?您问题中的查询不是笛卡尔积,因为您正确地连接了表(尽管where子句中使用了古老的隐式连接,而不是“现代”显式
JOIN
运算符)。请阅读。@a_horse_with_no_name:ok,谢谢。:)