我的查询如下:
SELECT 1
FROM [Call]
INNER JOIN [Caller] ON [Call].callerId = [Caller].id
WHERE [Call].[phoneNumber] = @phoneNumber
AND
[Caller].callerType = @callerType
AND
[Call].[time] > @time
AND
[Call].[status] = @status
AND
[Call].[type] <> @type
[Caller]
id
列上有一个群集主键索引。 [Call]
上有一个非聚集索引,如下所示:
CREATE INDEX IX_callerId_time_phonenumber_status_type
ON dbo.[Call]
(
[callerId] ASC,
[time] ASC,
[phoneNumber] ASC,
[status] ASC,
[type] ASC
)
我在执行计划中注意到我的查询成本的90%如下:
Predicate:
[Call].[status] = 10 AND [Call].[type] <> 10
Object:
[Call].[IX_callerId_time_phonenumber_status_type]
所以它使用正确的索引,但我的性能仍然不佳。有什么想法吗?
答案 0 :(得分:0)
谓词[Call].[time] > @time
相当不具备选择性,但索引的结构会强制SQL Server优先于其他可能更具选择性的标准。它可能会选择扫描每个callerId
的索引的大部分。像这样重新排序索引可能会提高此特定查询的性能:
CREATE INDEX IX_callerId_time_phonenumber_status_type
ON dbo.[Call]
(
[callerId] ASC,
[phoneNumber] ASC,
[status] ASC,
[time] ASC,
[type] ASC
)
答案 1 :(得分:0)
不知道&#34;时间&#34;实际上是Time数据类型或varchar数据类型,我建议使用以下索引。
CREATE NONCLUSTERED INDEX IX_callerId_time_phonenumber_status_type
ON [dbo].[Call] ([PhoneNumber],[Status],[Time],[Type])
答案 2 :(得分:0)
你排除了参数嗅探吗?想知道优化器是否卡在一些不值这个值上。