首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这两个查询之间会有性能上的差异吗?

这两个查询之间会有性能上的差异吗?
EN

Stack Overflow用户
提问于 2011-12-07 17:31:09
回答 3查看 105关注 0票数 2

1)

代码语言:javascript
复制
select * from student_tbl A ,result_tbl B where
A.student_name = B.student_name and
A.student_name = "xyz" ;

2)

代码语言:javascript
复制
select * from student_tbl A ,result_tbl B where
A.student_name = "xyz" and
A.student_name = B.student_name ;

我知道这些查询的结果是相同的。性能上有什么不同吗?如果是,请解释原因。

EN

回答 3

Stack Overflow用户

发布于 2011-12-07 18:03:34

查询不像程序那样执行。它们不是先做第一步再做第二步的过程,相反,它们是关于你想要什么结果的声明。在大多数现代RDBMS中,任何给定的查询都可以通过许多不同的查询计划来执行。通常,创建不同的查询计划,然后评估哪个计划运行得最快。在创建查询计划集时,它将考虑应该首先评估哪些条件,应该在评估条件之前还是之后进行连接,以及其他类似的事情,以试图找出哪些将被加速(基于它对表大小的了解和对给定条件中表的百分比的猜测)。他们中的许多人还会查看以前的结果,以便在他们的近似错误时为未来的决策提供信息。

在任何现代RDBMS中,这两个查询很可能会生成相同的查询计划集,因此会做出相同的选择,从而导致为两个查询执行相同的查询计划。根据您使用的RDBMS,通常有工具可用于查看为给定查询选择的特定查询计划,因此您可以使用该工具为特定数据库上的两个特定查询绝对回答问题。

现在,我应该注意到,这并不等同于说“任何两个总是在相同数据上产生相同答案的查询总是花费相同的时间”。可能会编写非常糟糕的查询,主要是通过不必要的复杂性,并且不能保证查询规划器会意识到您做得太过了。它可能会捕获简单的案例。所以,举个例子:

代码语言:javascript
复制
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

也可能会产生相同的查询计划。这也有可能:

代码语言:javascript
复制
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'

但是如果你做一些非常复杂的事情,比如

代码语言:javascript
复制
(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是一回事,并根据这些情况进行相应的调整。他们实际上做了各种转换,试图找到最好的查询,并且通常相当擅长找到它。可以覆盖查询规划器的决策,但只有当您确定有更好的方法来执行查询,并且数据更改不太可能改变这一点时,才应该这样做。

票数 6
EN

Stack Overflow用户

发布于 2011-12-07 17:35:11

这些都是一样的。where子句中的条件表示A.student_name和B.student_name都是"xyz“。查询优化器很可能会为这两者生成相同的执行计划,但您可以通过检查执行计划来检查这一点(例如,在SQL Server Management Studio中,如果您使用MS SQL Server)。

票数 2
EN

Stack Overflow用户

发布于 2011-12-07 18:10:59

假设您使用的是Sql server,您可以显示每个表的执行计划并查看实际发生了什么,这将显示每个操作的成本以及查询对每个表的实际操作。

对于不太深入的查看,您也可以只运行查询并检查执行时间。

我怀疑这里真正的问题是“where子句中条件的顺序是否会影响性能?”在这种情况下,您可能希望阅读这篇文章,以便发布Does the order of columns in a WHERE clause matter?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8413049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档