找到薪水高于“Comp”中某些讲师的所有教师的姓名。科学”。
select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = ‘Comp. Sci.’
select distinct T.name
from instructor as T, instructor as S
where S.dept_name = ‘Comp. Sci.’ and T.salary > S.salary
是否正确2查询比1查询更快?
答案 0 :(得分:2)
假设一个合理的SQL数据库系统具有合理的优化器,它们应该使用相同(或等效的)执行计划产生完全相同的结果。
SQL尽可能尝试成为声明性语言。您告诉系统您想要什么,而不是如何操作。
因此,评估单个谓词的顺序通常不由任何特定产品定义。 (可能存在一些例外情况)。
如果这里有两个不同的表,任何体面的优化器都应该尝试将基于dept_name
的谓词应用于它在S
表中扫描/搜索(也许选择使用一个允许它以低成本方式回答该谓词的索引,并且在将任何行提供给连接谓词之前,无论这些谓词在WHERE
子句中提供的顺序如何。
尽管如此,由于连接谓词中的不等式,我们可能希望的最好的是对instructor
表进行单次扫描。如果在salary
上有一个索引,它可以用它来便宜地评估不平等(否则它可能会选择对数据进行排序,如果它足够聪明并且统计数据有保证的话)。
所以,总结一下,保持简单。编写简单易懂的查询,易于理解 intent 。然后,衡量绩效,如果不充分,则开始调查执行计划,以确定成本/潜在缺失索引的位置并从那里开始工作。
不尝试学习“黄金规则”,表示你必须始终做X或Y才能获得“最佳”表现。