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

时间:2008-11-11 05:19:24

标签: sql rdbms

所以我想知道这个问题是否有明确的答案 此外,索引是群集还是非群集是否重要。 在所有RDBMS实现中是否相同,或者确切的行为是专有的?

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

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

但是我看到一个未命名的DBMS上的查询确实根据SQL查询顺序改变了索引的使用。

答案 2 :(得分:1)

where子句的顺序不应该影响查询计划或任何可尊重的数据库中使用的索引,尽管我已经看到至少一个(不尊重的)数据库,但事实并非如此。

答案 3 :(得分:1)

曾经(很久以前,即直到1995年左右)Oracle过去只有一个“基于规则的优化器”,而且这肯定是WHERE子句中谓词的顺序和表的顺序在FROM子句中(当时没有JOIN语法),影响了查询计划:这是记录的情况。但是,基于成本的优化器(Oracle自那时起)已尝试检查所有可能的计划(或至少在一些合理的参数范围内尽可能多的计划),并选择最有效的计划。

答案 4 :(得分:0)

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