我有两个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
在第一个查询中,我首先过滤特定表的数据然后应用连接,然后在第二个表中首先应用连接然后我应用where条件来过滤数据。 我想知道的是哪一个更快,为什么。
答案 0 :(得分:1)
第二个查询更快,因为优化器会首先使用where子句过滤表,然后创建内部临时表,以后用于连接。结论 - 更好的解决方案是连接包含较小数据集的表。
顺便说一句,优化器更容易处理第二个查询,其中不包含子查询。
答案 1 :(得分:0)
您可以在SQL Server 2008中显示执行计划。某处有一个按钮。只需将两个查询放在同一窗口中,它就会告诉您每个查询占用了多少时间。结果的正确性可能取决于实际花费超过一毫秒或两秒的查询。
我相信第二个查询为优化器提供了更大的自由度,而第一个查询则强制它进入一些可能效率低下的路径(但它也可以强制它进入优化器不会尝试的更有效的路径)。我很确定效率的差异将取决于表格布局,但我怀疑优化查询对于这样一个简单的查询效率会低得多。
请注意(据我所知)关于SQL的重要事情并不是告诉它如何处理,只是让优化器处理它,所以第二个查询是首选(虽然优化器并不总是做得很好,所以我建议让优化器处理它,做一些压力测试,看看事情是否缓慢,可能使用分析器来识别有问题的查询,并强制它进入更有效的路径。)
答案 2 :(得分:0)
一般规则是子查询会更慢,特别是如果连接使用正确的索引。