SQL Server,使用正确的索引查询但仍然很慢

时间:2015-04-15 20:31:11

标签: sql sql-server indexing

我的查询如下:

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]

所以它使用正确的索引,但我的性能仍然不佳。有什么想法吗?

3 个答案:

答案 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)

你排除了参数嗅探吗?想知道优化器是否卡在一些不值这个值上。

这是我最喜欢的文章http://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/