我在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
当然,如果有一种我没想过的更快的方式,请分享。我也很想知道为什么一个查询比其他查询更快。
答案 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;