您的查询实际上是最佳的。
LEFT JOIN
其他人提出的更糟糕,因为他们选择了所有值,然后将它们过滤掉。
很可能您的子查询将为此优化:
SELECT *
FROM Properties p
WHERE NOT EXISTS
(
SELECT 1
FROM Countries i
WHERE i.CountryID = p.CountryID
)
OR
NOT EXISTS
(
SELECT 1
FROM Regions i
WHERE i.RegionID = p.RegionID
)
OR
NOT EXISTS
(
SELECT 1
FROM Areas i
WHERE i.AreaID = p.AreaID
)
, 你应该使用它。
此查询从每个表中最多选择 1 行,并在找到该行时跳到下一次迭代(即,如果它没有找到Country
给定属性的 a ,它甚至不会检查 a Region
)。
同样,SQL Server
它足够聪明,可以为此查询和您的原始查询构建相同的计划。
更新:
512K
对每个表中的行进行测试。
维度表中所有对应ID
的 ' 都是CLUSTERED PRIMARY KEY
',所有度量字段Properties
都被索引。
对于 , 中的每一行Property
,PropertyID = CountryID = RegionID = AreaID
没有实际缺失的行(就执行时间而言最坏的情况)。
不存在 00:11(11 秒)
左加入 01:08(68 秒)