查询不像程序那样执行。他们不是做第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和B = C与A = C和A = B并针对这些情况进行相应调整。他们实际上做了各种转换,试图找到最好的查询,并且通常很擅长查找它。可以重写查询计划程序的决策,但只有在确定有更好的方法来执行查询并且数据更改不可能改变查询时才能完成。
无论可能存在的差异(如果有的话)都可能是实现特定的。对我而言,这属于“微观优化”类别。为什么不设置一个测试用例并在测试结果非常重要时进行测量? – spender
@spender我*猜*这是作业。可能是错的。我只是因为再次错误而已......这已经过去了几秒钟! ;) –
@andrew barber我刚才在我的问题中给了一个简单的例子。实际上他们有2个表格,数据量很大。 – user1085296