【发布时间】:2020-01-06 02:44:03
【问题描述】:
我有一个如下的 SQL 查询:
Declare @ConnectionType int = 5,
@UserId int = 2
select * from CallDetails
Where ((@ConnectionType = 0 AND CallDetails.DeviceType IN (0,1,2,3,4,5,7,8))
OR (@ConnectionType = 1 AND CallDetails.DeviceType = 4)
OR (@ConnectionType = 2 AND CallDetails.DeviceType IN (0,1,2,3,7))
OR (@ConnectionType = 3 AND CallDetails.DeviceType = 5)
OR (@ConnectionType = 4 AND CallDetails.DeviceType IN (0,1,2,3,4,7))
OR (@ConnectionType = 5 AND CallDetails.DeviceType IN (4,5))
OR (@ConnectionType = 6 AND CallDetails.DeviceType IN (0,1,2,3,5,7))
OR (@ConnectionType = 7 AND CallDetails.DeviceType IN (8))
OR (@ConnectionType = 8 AND CallDetails.DeviceType IN (0,1,2,3,7,8))
OR (@ConnectionType = 9 AND CallDetails.DeviceType IN (5,8))
OR (@ConnectionType = 10 AND CallDetails.DeviceType IN (4,8))
OR (@ConnectionType = 11 AND CallDetails.DeviceType IN (0,1,2,3,4,8))
OR (@ConnectionType = 12 AND CallDetails.DeviceType IN (0,1,2,3,5,8))
OR (@ConnectionType = 13 AND CallDetails.DeviceType IN (4,5,8))
OR (@ConnectionType = 14 AND CallDetails.DeviceType IN (0,1,2,3,7,4,5))
OR @ConnectionType IS NULL)
查询的另一部分是:
AND (@UserId IS NULL OR @ConnectionType IN (1,3,5,7,9,10,13)
OR (@ConnectionType = 0 AND (CallDetails.DeviceType IN (4,5,8) OR (CallDetails.UserId = @UserId)))
OR (@ConnectionType = 2 AND ((CallDetails.UserId = @UserId)))
OR (@ConnectionType = 4 AND (CallDetails.DeviceType = 4 OR (CallDetails.UserId = @UserId)))
OR (@ConnectionType = 6 AND (CallDetails.DeviceType = 5 OR (CallDetails.UserId = @UserId)))
OR (@ConnectionType = 8 AND (CallDetails.DeviceType = 8 OR (CallDetails.UserId = @UserId)))
OR (@ConnectionType = 11 AND (CallDetails.DeviceType IN (4,8) OR (CallDetails.UserId = @UserId)))
OR (@ConnectionType = 12 AND (CallDetails.DeviceType IN (5,8) OR (CallDetails.UserId = @UserId)))
OR (@ConnectionType = 14 AND (CallDetails.DeviceType IN (4,5) OR (CallDetails.UserId = @UserId)))
)
@ConnectionType 是多个设备的组合,在此基础上将确定DeviceType。以后将添加任何其他设备@ConnectionType 组合将增加等等。这个查询也在多个Store Procedures 中使用。如何优化此查询?
【问题讨论】:
-
这似乎使用查找表或使用动态语句会更好(我个人会推荐先验,因为它可能更容易实现)。
-
@Larnu 怎么办?有什么线索吗?
标签: sql sql-server optimization query-optimization