处理时间是否因SQL查询顺序而异?
查找“Comp”中工资高于某些讲师的所有讲师的姓名。Sci’处理时间是否因SQL查询顺序而异?,sql,database,Sql,Database,查找“Comp”中工资高于某些讲师的所有讲师的姓名。Sci’ 2个查询比1个查询快吗?假设一个有合理优化器的像样的SQL数据库系统,它们应该使用相同(或等效)的执行计划生成完全相同的结果 SQL尽可能尝试成为一种声明性语言。你告诉系统你想要什么,而不是怎么做 因此,单个谓词的求值顺序通常不由任何特定产品定义。(可能存在一些例外情况) 如果这里有两个不同的表,任何优秀的优化器都应该在扫描/查找S表时(可能选择使用一个索引,使其能够廉价地回答该谓词),并在向联接谓词提供任何行之前,尝试应用基于d
2个查询比1个查询快吗?假设一个有合理优化器的像样的SQL数据库系统,它们应该使用相同(或等效)的执行计划生成完全相同的结果 SQL尽可能尝试成为一种声明性语言。你告诉系统你想要什么,而不是怎么做 因此,单个谓词的求值顺序通常不由任何特定产品定义。(可能存在一些例外情况) 如果这里有两个不同的表,任何优秀的优化器都应该在扫描/查找
S
表时(可能选择使用一个索引,使其能够廉价地回答该谓词),并在向联接谓词提供任何行之前,尝试应用基于dept\u name
的谓词,无论这些谓词以何种顺序出现在WHERE
子句中
但就在这里,由于连接谓词中的不平等性,我们可能希望的最好结果是对讲师
表进行一次扫描。如果在工资上有一个指数,它可能可以用这个指数来廉价地评估不平等性(否则,如果它足够聪明,并且统计数据也证明了这一点,它可能会选择对数据进行排序)
总而言之,事情要简单。编写简单、直截了当的查询,这些查询很容易理解用户的意图。然后,测量性能,如果性能不够,则开始调查执行计划,以确定成本/潜在缺失指标的位置,并从那里着手
不要试图学习“黄金法则”,即必须始终执行X或Y以获得“最佳”性能。切勿在FROM
子句中使用逗号。始终使用正确、明确、标准的JOIN
语法。不,顺序不重要。可能是因为稍后会出现表连接的位,我不确定,但听起来似乎有道理,因为它可能会在更多记录上测试dept_名称(不必要)。我可能错了。但无论如何,使用正确的联接语法都会更好、更清晰。@Mike这可能无关紧要,因为在内部,显式联接和隐式联接可能具有相同的执行计划。我想,至少是这样。@Mike,但所有主要的关系数据库都是这样。不过,OP应该用数据库标记,这是对的。您使用的是哪种dbms?
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