代码之家  ›  专栏  ›  技术社区  ›  Daniel Honig

where子句中参数的顺序是否影响表是否使用索引?

  •  4
  • Daniel Honig  · 技术社区  · 16 年前


    另外,索引是聚集的还是非聚集的有关系。 在所有的RDBMS实现中是相同的,还是确切的行为是私有的?

    5 回复  |  直到 16 年前
        1
  •  6
  •   Ned Batchelder    16 年前

    SQL是一种声明性语言,而不是过程性语言。每个SQL实现在实现细节方面都会有自己的怪癖,比如使用哪些索引,优化器如何决定使用哪些索引,SQL程序员可以做些什么来影响选择,等等。

        2
  •  1
  •   paxdiablo    16 年前

    索引的使用不是SQL标准的一部分,而是特定DBMS的实现细节。

    理想情况下,它不应该影响它,因为它不会影响返回的实际行。

    但我见过在未命名DBMS上的查询,它确实根据SQL查询顺序更改了索引的使用。

        3
  •  1
  •   Robert Gamble    16 年前

    where子句的顺序不应该影响查询计划或任何可尊敬的数据库中使用的索引,尽管我至少见过一个(不可尊敬的)数据库,但情况并非如此。

        4
  •  1
  •   Tony Andrews    16 年前

    有一段时间(很久以前,也就是直到1995年左右),甲骨文曾经只有一个“基于规则的乐观主义者”,有了这个原因,WHERE子句中的谓词顺序和FROM子句中的表顺序(当时没有连接语法)肯定影响了查询计划:有记录表明就是这样。然而,基于成本的乐观主义者(甲骨文从那时起就开始)试图检查所有可能的计划(或者至少在一些合理的参数范围内尽可能多的计划),并选择最有效的计划。

        5
  •  0
  •   Timex    14 年前

    这很难回答,因为我想没有人真正知道,包括DBMS工程师!哈哈,这是讽刺,但我真正的意思是,它本质上是不确定的。我可能是错的,但它实际上可以归结为DB引擎实现,因为ANSI-SQL标准,或者据我所知,任何其他标准都没有规范索引语义的概念。但是,我知道,对任何索引字段的第一次引用都很重要,因为它标记了查询引擎决策树的顶部。根据索引的数量和类型,查询引擎可以选择使用它找到的第一个和最匹配的索引,也可以决定“优化”并使用另一个索引。我认为,正是这一点使它变得不确定。