Этот запрос выполняется очень быстро (‹100 мс):
SELECT TOP (10)
[Extent2].[CompanyId] AS [CompanyId]
,[Extent1].[Id] AS [Id]
,[Extent1].[Status] AS [Status]
FROM [dbo].[SplittedSms] AS [Extent1]
INNER JOIN [dbo].[Sms] AS [Extent2]
ON [Extent1].[SmsId] = [Extent2].[Id]
WHERE [Extent2].[CompanyId] = 4563
AND ([Extent1].[NotifiedToClient] IS NULL)
Если я добавлю только временной фильтр, это займет слишком много времени (22 секунды!):
SELECT TOP (10)
[Extent2].[CompanyId] AS [CompanyId]
,[Extent1].[Id] AS [Id]
,[Extent1].[Status] AS [Status]
FROM [dbo].[SplittedSms] AS [Extent1]
INNER JOIN [dbo].[Sms] AS [Extent2]
ON [Extent1].[SmsId] = [Extent2].[Id]
WHERE [Extent2].Time > '2015-04-10'
AND [Extent2].[CompanyId] = 4563
AND ([Extent1].[NotifiedToClient] IS NULL)
Я попытался добавить индекс в столбец [Time]
таблицы Sms
, но оптимизатор, похоже, не использует индекс. Пробовал использовать With (index (Ix_Sms_Time))
; но, к моему удивлению, это занимает еще больше времени (29 секунд!).
Вот фактический план выполнения:
План выполнения одинаков для обоих запросов. Упомянутые здесь таблицы содержат от 5 млн до 8 млн строк (индексы фрагментированы на ‹ 1%, а статистика обновляется). Я использую MS SQL Server 2008R2 на 16-ядерном компьютере с 32 ГБ памяти Windows 2008 R2)