SQL查询将以何种顺序执行

时间:2015-03-18 12:57:13

标签: sql performance postgresql

我有一个查询,如下所示

select 
    student_id, student_name, student_total 
from 
    student 
where 
    (student_name like %a% and student_total > 400) 
    or student_rank < 10

在SQL引擎中,它将如何执行此查询。条件是从右到左还是从左到右检查?

1 个答案:

答案 0 :(得分:5)

没有

你不知道,你不能依赖答案。

执行计划程序是处理准备执行查询的实际逐步计划的计划程序。这将随着指数,统计数据等而变化。它可能会首先在包含100行的表上评估like,但student_rank < 10首先在一个包含1000万行和student_rank上的索引的表上进行评估。如果统计信息是正确的并且您有student_total的索引,它可能会基于student_total 首先进行过滤,即使它位于过滤器表达式树的深处。答案也可能随着引擎的新版本而改变,甚至可能随着服务器的升级和更新而改变(例如可用内存量,总网络和CPU负载......)

为什么要关心?这是数据库引擎要解决的问题。鉴于你正在做like '%something%',它很可能会将其作为最后一个条件 - 只要它有一个可以用于student_rank的索引。

没有明确的执行顺序这一事实也可能会让您感到惊讶。例如,如果你有一个函数在它传递null的值时抛出异常/错误,那么(SomeColumn is not null and MyFunction(SomeColumn)) 是安全的 - 它仍然会抛出nullSomeColumn值为{{1}}的任何行的异常/错误。

只有最原始的(几乎没有)SQL数据库才有任何固定执行顺序的概念。你应该关注的是首先使SQL可读。必须始终精确地记录性能调整,以及复制意图行为等的测试,因为它们非常脆弱。在添加索引提示之前,请确保您的索引得到适当维护,具有最新统计信息,低碎片,良好的覆盖率等。当执行计划程序生成次优执行计划时,它几乎总是您的错(并且很少,引擎中的细微错误或已知限制) - 通过在SQL中尝试性能技巧,或者没有DBA负责维护。