所以我想知道这个问题是否有明确的答案。
此外,索引是集群还是非集群是否重要。它在所有 RDBMS 实现中都是一样的,还是确切的行为是专有的?
5 回答
SQL is a declarative language, not a procedural one. Each SQL implementation is going to have its own quirks about implementation details like which indexes get used, how the optimizer decides which indexes to use, what the SQL programmer can do to affect the choice, and so on.
Use of indexes is not a part of the SQL standard, but rather an implementation detail of the particular DBMS.
Ideally, it shouldn't affect it, since it doesn't affect the actual rows that are returned.
But I've seen queries on an unnamed DBMS that does change index use based on the SQL query order.
The ordering of the where clause shouldn't affect the query plan or the indices used in any respectable database although I have seen at least one (non-respectable) database where this wasn't the case.
曾经(很久以前,即直到大约 1995 年)Oracle 曾经只有一个“基于规则的优化器”,因此 WHERE 子句中谓词的顺序和 FROM 中的表顺序肯定是这种情况子句(当时没有 JOIN 语法),影响了查询计划:记录就是这种情况。然而,基于成本的优化器(Oracle 从那时起就有)试图检查所有可能的计划(或者至少,在一些合理的参数范围内尽可能多地)并选择最有效的。
这很难回答,因为我认为没有人真正知道,包括 DBMS 工程师!大声笑,这是讽刺,但我真正的意思是它本质上是不确定的。我可能是错的,但它确实归结为数据库引擎实现,因为据我所知,ANSI SQL 标准或任何其他标准都没有规范索引语义的概念。但是,我确实知道,对任何索引字段的第一个引用都很重要,因为它标志着查询引擎的决策树的顶部。从那里开始,根据索引的数量和类型,查询引擎可能会选择使用它找到的第一个和最匹配的索引,或者它可能决定“优化”而不是使用另一个索引。我认为,这就是使其具有不确定性的部分。