У меня есть запрос следующим образом:SQL Server, запрос с использованием указательного, но все еще медленно
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]
Так он использует право но я все еще плохо себя чувствую. Есть идеи?
Это сканирование индекса правильно? Ваше неравенство в предикате потенциально делает предикат nonSARGable. Просто изменив на call.type> 10 ИЛИ call.type <10, вероятно, сделает вместо этого поиск. –
Только столбец «время» используется для перемещения по дереву. Нет ничего, что сужает обход вниз - все это будет всего лишь предикатом фильтра. Вы должны всегда индексировать сначала по принципу равенства, а не по диапазонам. –
@SeanLange это уже уже поиск. – ashishduh