Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql where子句中参数的顺序是否影响表是否使用索引?_Sql_Rdbms - Fatal编程技术网

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

Sql where子句中参数的顺序是否影响表是否使用索引?,sql,rdbms,Sql,Rdbms,所以我想知道这个问题是否有明确的答案。 另外,索引是聚集索引还是非聚集索引也很重要。 它在所有RDBMS实现中都是一样的,还是确切的行为将是专有的?SQL是一种声明性语言,而不是过程性语言。每个SQL实现在实现细节方面都会有自己的怪癖,比如使用哪些索引、优化器如何决定使用哪些索引、SQL程序员可以做些什么来影响选择等等。索引的使用不是SQL标准的一部分,而是特定DBMS的实现细节 理想情况下,它不应该影响它,因为它不会影响返回的实际行 但是我见过在一个未命名的DBMS上的查询,它确实会根据SQL

所以我想知道这个问题是否有明确的答案。
另外,索引是聚集索引还是非聚集索引也很重要。
它在所有RDBMS实现中都是一样的,还是确切的行为将是专有的?

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

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

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


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

where子句的顺序不应该影响查询计划或任何值得尊敬的数据库中使用的索引,尽管我曾经见过至少一个(不值得尊敬的)数据库不是这样。

(很久以前,也就是直到1995年左右)Oracle过去只有一个“基于规则的优化程序”,因此WHERE子句中谓词的顺序和FROM子句中表的顺序(当时没有连接语法)肯定会影响查询计划:这是有记录的。然而,基于成本的优化程序(从那时起,甲骨文一直在尝试检查所有可能的计划(或者至少在某些合理的参数范围内检查尽可能多的计划)选择最有效的。

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

这就是为什么我总是在实践中检查查询计划,但是,你会如何回答面试?准确地说,它是功能性的。但这是完美的答案。@Ned你能做出几乎总是正确的陈述吗?例如from子句或者order by子句总是会影响查询性能?@Hugo:我想知道你为什么说它是功能性的:没有功能性的组合,而且语句是非常声明性的:选择这个,更新那个,等等,没有关于如何进行的细节。确定的答案?不。专有可能是错误的词-复杂程度更合适。一个好的优化器将使用外部启发法,如统计数据、IO成本(尤其是集群与非集群)或其他提示,而不是纯粹的术语排序来选择索引。