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

对比

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 条件过滤数据。我想知道的是哪一个更快,为什么。

4

3 回答 3

1

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

顺便说一句,优化器更容易处理不包含子查询的第二个查询。

于 2012-11-30T07:49:11.987 回答
0

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

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

请注意(根据我的说法)关于 SQL 的重要事情不是告诉它如何做事,而是让优化器处理它,所以第二个查询是首选(尽管优化器并不总是做得很好,所以我'd 建议让优化器处理它,做一些压力测试,看看事情是否很慢,也许使用分析器来识别有问题的查询,并强制它进入更有效的路径)。

于 2012-11-30T07:21:17.120 回答
0

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

于 2012-12-12T18:13:34.927 回答