2012-11-29 129 views
0

我有两个SQL查询如下比较查询

SELECT rc.stateId,rs.stateName FROM 
(SELECT DISTINCT cityid FROM HolidayPackageCity) AS hpc 
INNER JOIN 
(SELECT cityid,stateid FROM RegCity WHERE countryCode='IN' AND stateId IS NOT NULL) AS rc 
ON hpc.cityId=rc.cityId 
INNER JOIN 
RegState AS rs 
ON rc.stateId=rs.stateId 

VS

SELECT DISTINCT rc.stateId,rs.stateName 
FROM HolidayPackageCity AS hpc 
INNER JOIN 
    RegCity AS rc 
    ON hpc.cityId=rc.cityId 
    INNER JOIN 
    RegState AS rs 
    ON rc.stateId=rs.stateId 
WHERE rc.countryCode='IN' AND rc.stateId IS NOT NULL 

在第一查询第一i-过滤特定表的数据然后应用加入和第一在第二表我申请加入,然后我应用条件来过滤数据。 我想知道的是从哪一个和为什么哪个更快。

+3

如果你想知道哪一个是快,你可以在你的SQL客户端查看执行时间 –

+1

您还可以检查'EXPLAIN'命令对于每个查询,显示的步骤,该数据库需要执行查询。只需在查询前放置'EXPLAIN'关键字即可。 –

+0

是解释存在于SQL 2008(我不能够使用它) – Vishwajeet

回答

1

第二次查询速度更快,因为优化器会先用WHERE子句过滤表,然后创建,后来用于连接内部临时表。结论 - 更好的解决方案是加入包含较小数据集的表。

顺便说一句,优化更容易处理第二查询,其中没有包含的子查询。

+1

完美..... + 1 – Dejan

0

可以显示在SQL Server 2008中的执行计划有一个按钮某处。只需将这两个查询放在同一个窗口中,它就会告诉你哪个时间花费在每个窗口上。结果的正确性可能取决于实际需要超过一毫秒或两个毫秒的查询。

我相信第二个查询为优化器提供了更多的自由度,而第一个查询会迫使它进入一些可能效率低下的路径(但它也可以强制它成为优化器不会尝试的更有效的路径)。我很确定效率的差异取决于表布局,但我怀疑优化后的查询对于这样一个简单的查询效率会低很多。

请注意(根据我的观点),关于SQL的一件大事并不是告诉它如何做,而只是让优化器处理它,所以第二个查询是首选的(尽管优化器并不总是很好因此我建议让优化器处理它,做一些压力测试,看看事情是否缓慢,也许使用分析器来识别有问题的查询,并强制它成为一个更有效的路径)。

0

一般的规则是,子查询会慢一些,特别是如果使用正确的索引连接。