2011-12-07 41 views
2

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 ; 

我知道,这些查询的结果都是一样的。 是否有任何性能差异?如果是这样,请解释原因。

+1

无论可能存在的差异(如果有的话)都可能是实现特定的。对我而言,这属于“微观优化”类别。为什么不设置一个测试用例并在测试结果非常重要时进行测量? – spender

+1

@spender我*猜*这是作业。可能是错的。我只是因为再次错误而已......这已经过去了几秒钟! ;) –

+0

@andrew barber我刚才在我的问题中给了一个简单的例子。实际上他们有2个表格,数据量很大。 – user1085296

回答

2

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

+0

他们是一样的吗?假设谓词的评估顺序对于每一行都是相同的。现在假设大量候选人满足一个谓词但不满足第二个谓词。假设运行查询的enqine使用快捷方式评估。他们仍然是一样的吗?可能差不多,但你能确定吗? – spender

+0

@spender我的意思是很容易想象一个好的查询优化器会做什么:它将结合来自A和B的那些student_name为“xyz”的元组。至少我无法想象一个更优化的生成结果集的方式。实际的实现取决于你使用的DBMS,这就是为什么我建议比较执行计划。 – kol

+2

@downvoter请解释downvote,让我学习... – kol

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和B = C与A = C和A = B并针对这些情况进行相应调整。他们实际上做了各种转换,试图找到最好的查询,并且通常很擅长查找它。可以重写查询计划程序的决策,但只有在确定有更好的方法来执行查询并且数据更改不可能改变查询时才能完成。

2

假设您使用的是Sql服务器,您可以为每个服务器显示执行计划并查看实际发生的情况,这将显示每个操作的成本以及查询实际对每个表执行的操作。

对于深度较浅的外观,您还可以运行查询并检查执行时间。

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

相关问题