哪个是运行此SQL查询的最快方法?

时间:2017-03-07 12:52:11

标签: sql-server

我在SQL Server 2016中有一个表(我们称之为A),我想查询它。我只需要选择那些具有明确状态的行,所以我需要排除一些行。还有另一个表(B),包含表A中的记录ID和两列col1和col2。如果这些列非空,则可以将相应的记录视为final。表A和表B之间存在一对一的关系。因为这些表相当大,所以我想使用最有效的查询。我应该选择哪个?

SELECT *
FROM TableA
WHERE record_id IN
  (SELECT record_id FROM TableB WHERE col1 IS NOT NULL AND col2 IS NOT NULL)

SELECT a.*
FROM TableA a
INNER JOIN TableB b ON a.record_id = b.record_id
WHERE b.col1 IS NOT NULL AND b.col2 IS NOT NULL

SELECT a.*
FROM TableA a
INNER JOIN TableB b
ON a.record_id = b.record_id
  AND b.col1 IS NOT NULL
  AND b.col2 IS NOT NULL

当然,如果有一种我没想过的更快的方式,请分享。我也很想知道为什么一个查询比其他查询更快。

2 个答案:

答案 0 :(得分:0)

WITH cte AS 
(SELECT b.record_id, b.col1, b.col2
FROM TableB b
WHERE col1 IS NULL
AND col2 IS NULL --if the field isn't NULL, it might be quicker to do <> '')

SELECT a.record_id, a.identifyColumnsNeededExplicitely
FROM cte
JOIN TableA a ON a.record_id = cte.record_id
ORDER BY a.record_id

答案 1 :(得分:0)

在实践中,执行计划将根据您当前的索引/聚集索引/外键/约束/表格(也就是行数/行的一般含量/ ...)执行任何它喜欢的操作。任何分析都应该逐个进行,2个表的真实情况可能不是2个表。

Theorically,

没有任何索引,第一个应该是最好的,因为它将对TableB上的1个表扫描进行优化,TableB上有2个扫描,Table1上有1个表扫描。

TableA.record_id上的外键引用TableB.record_id或两列中的索引,第二个应该更快,因为它将进行扫描索引和2次恒定扫描。

在极少数情况下,它可能是第3个,具体取决于TableB统计数据。但距离数字2不远,因为数字3将扫描所有TableB。

在更罕见的情况下,3都不是。

我试图说的是:&#34;由于我们既没有你的表也没有行,所以打开你的SQL管理,打开统计数据并自己尝试。&#34;