use*_*296 2 sql database-performance
1)
select * from student_tbl A ,result_tbl B where
A.student_name = B.student_name and
A.student_name = "xyz" ;
Run Code Online (Sandbox Code Playgroud)
2)
select * from student_tbl A ,result_tbl B where
A.student_name = "xyz" and
A.student_name = B.student_name ;
Run Code Online (Sandbox Code Playgroud)
我知道这些查询的结果是一样的.有任何性能差异吗?如果是这样,请解释原因.
查询不像程序那样执行.它们不是执行步骤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
Run Code Online (Sandbox Code Playgroud)
也可能会生成相同的查询计划.这也可能是:
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'
Run Code Online (Sandbox Code Playgroud)
但是,如果你做了一些非常复杂的事情
(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')
Run Code Online (Sandbox Code Playgroud)
它可能会运行更复杂的查询计划.(即使完全不必要的复杂查询将产生与其他两个相同的结果(假设没有NULL)).
因此,优化器不是无所不知的,但它们确实倾向于认识到X和Y与Y和X是相同的,并且A = B AND B = C与A = C和A = B是相同的并且相应地调整对于那些情况.它们实际上进行了各种转换以尝试找到最佳查询,并且通常非常擅长查找它.可以覆盖查询计划程序的决策,但只有在您确定有更好的方法来执行查询并且数据更改不太可能改变时,才应该这样做.