t-sql JOIN where 子句最佳实践
t-sql JOIN where clause best practice
我有以下查询:
SELECT s.LogonId "StaffId" FROM [dbo].[SQMap] sq
INNER JOIN [dbo].[Staff] s ON s.Id = sq.StaffId
INNER JOIN [dbo].[Queue] q ON q.Id = sq.QueueId
WHERE sq.QueueId = @queueId AND q.IsAuto = 1
我被要求更改查询以向 where 子句添加更多条件
WHERE sq.QueueId = @queueId
AND q.Id = @queueId
AND q.IsAutoAssigned = 1
我想知道 q.Id = @queueId 是否真的需要。我见过很多具有这种冗余条件的查询。真的需要这些吗?最佳做法是什么?
当然是必需的。如果查询不包含您要过滤的特定 queueId
(假设您要过滤),那么将返回所有 QueueId 的所有记录。
但它不必出现两次,因为连接条件将输出限制为仅包含来自 dbo.Queue
且与来自 dbo.SQLMap
的 queueId
相匹配的记录其中任何一个的谓词都会限制两个表。
我唯一一次看到有意使用重复条件产生良好影响的是试图让查询优化器提出更好的计划。但那是几年前在不同的关系数据库上。使用现代优化器,添加重复条件很少会稍微改变计划。查看的方法是 运行 两个查询并查看计划是否不同。
我有以下查询:
SELECT s.LogonId "StaffId" FROM [dbo].[SQMap] sq
INNER JOIN [dbo].[Staff] s ON s.Id = sq.StaffId
INNER JOIN [dbo].[Queue] q ON q.Id = sq.QueueId
WHERE sq.QueueId = @queueId AND q.IsAuto = 1
我被要求更改查询以向 where 子句添加更多条件
WHERE sq.QueueId = @queueId
AND q.Id = @queueId
AND q.IsAutoAssigned = 1
我想知道 q.Id = @queueId 是否真的需要。我见过很多具有这种冗余条件的查询。真的需要这些吗?最佳做法是什么?
当然是必需的。如果查询不包含您要过滤的特定 queueId
(假设您要过滤),那么将返回所有 QueueId 的所有记录。
但它不必出现两次,因为连接条件将输出限制为仅包含来自 dbo.Queue
且与来自 dbo.SQLMap
的 queueId
相匹配的记录其中任何一个的谓词都会限制两个表。
我唯一一次看到有意使用重复条件产生良好影响的是试图让查询优化器提出更好的计划。但那是几年前在不同的关系数据库上。使用现代优化器,添加重复条件很少会稍微改变计划。查看的方法是 运行 两个查询并查看计划是否不同。