我有一个查询,如下所示
select
student_id, student_name, student_total
from
student
where
(student_name like %a% and student_total > 400)
or student_rank < 10
在SQL引擎中,它将如何执行此查询。条件是从右到左还是从左到右检查?
答案 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))
不是安全的 - 它仍然会抛出null
中SomeColumn
值为{{1}}的任何行的异常/错误。
只有最原始的(几乎没有)SQL数据库才有任何固定执行顺序的概念。你应该关注的是首先使SQL可读。必须始终精确地记录性能调整,以及复制意图行为等的测试,因为它们非常脆弱。在添加索引提示之前,请确保您的索引得到适当维护,具有最新统计信息,低碎片,良好的覆盖率等。当执行计划程序生成次优执行计划时,它几乎总是您的错(并且很少,引擎中的细微错误或已知限制) - 通过在SQL中尝试性能技巧,或者没有DBA负责维护。