1)
select * from student_tbl A ,result_tbl B where
A.student_name = B.student_name and
A.student_name = "xyz" ;
2)
select * from student_tbl A ,result_tbl B where
A.student_name = "xyz" and
A.student_name = B.student_name ;
我知道这些查询的结果是一样的。 有任何性能差异吗?如果是这样,请解释原因。
答案 0 :(得分:6)
查询不像程序那样执行。它们不是执行步骤1然后执行步骤2的过程。相反,它们是关于您想要的结果的声明性陈述。在大多数现代RDBMS中,任何给定的查询都可以通过许多不同的查询计划来执行。通常,会创建不同的查询计划,然后评估哪个计划运行得最快。在创建查询计划集时,它会考虑应该首先评估哪些条件,是否应该在评估条件之前或之后进行连接以及其他类似的事情来尝试找出哪些条件将被禁食(基于其知识)表格大小和猜测表格将包含在给定条件中的百分比)。他们中的许多人也会查看以前的结果,以便为将来的决策提供信息,告知他们的近似值是错误的。
最有可能的是,在任何现代RDBMS中,这两个查询将生成相同的查询计划集,因此将进行相同的选择,从而导致为两个查询执行相同的查询计划。根据您使用的RDBMS,通常有一些工具可用于查看为给定查询选择的特定查询计划,因此您可以使用它来完全回答特定数据库上的两个特定查询的问题。
现在,我应该注意到,这并不等于说“任何两个在同一数据上总会产生相同答案的查询总是花费相同的时间。”有可能编写非常糟糕的查询,主要是通过不必要的复杂性,并且无法保证查询计划程序会意识到您已经过度了。它可能会抓住简单的案例。所以,例如:
SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = B.student_name AND
A.student_name = 'xyz' AND
B.student_name = A.student_name
也可能会生成相同的查询计划。这也可能是:
SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = B.student_name AND
A.student_name = 'xyz' AND
B.student_name = 'xyz'
但如果你做的事情非常复杂,比如
(SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = B.student_name AND
A.student_name = 'xyz')
UNION
(SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = B.student_name AND
B.student_name = 'xyz')
INTERSECT
(SELECT * FROM student_tbl A, result_tbl B WHERE
A.student_name = 'xyz')
它可能会运行更复杂的查询计划。 (即使完全不必要的复杂查询将产生与其他两个相同的结果(假设没有NULL))。
所以,优化器不是无所不知的,但它们确实倾向于认识到X和Y与Y和X是相同的,并且A = B AND B = C与A = C和A = B是相同的并根据这些情况进行相应调整。它们实际上进行了各种转换以尝试找到最佳查询,并且通常非常擅长查找它。可以覆盖查询计划程序的决策,但只有当您确定有更好的方法来执行查询并且数据更改不太可能改变时,才应该这样做。
答案 1 :(得分:2)
这些都是一样的。 where子句中的条件表示A.student_name和B.student_name都是“xyz”。查询优化器很可能会为两者生成相同的执行计划,但您可以通过检查执行计划来检查这一点(例如,在SQL Server Management Studio中,如果您使用的是MS SQL Server)。
答案 2 :(得分:2)
假设您正在使用Sql服务器,您可以为每个服务器显示执行计划并查看实际发生的情况,这将显示每个操作的成本以及查询对每个表实际执行的操作。
为了深入了解,您还可以运行查询并检查执行时间。
我怀疑这里真正的问题是“where子句中的条件顺序是否会影响性能?”在这种情况下,您可能希望阅读此SO帖子Does the order of columns in a WHERE clause matter?