Этот запрос выполняется очень быстро (< 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)
Попробуйте добавить ORDER BY ASC или DESC TIME столбец и проверьте. Он должен работать быстрее. –
Во-первых, без 'ORDER BY' строки, возвращаемые запросом' TOP', не являются детерминированными. Лучшей практикой является указание 'ORDER BY' с' TOP'. Чтобы повысить производительность второго запроса, попробуйте составной некластеризованный индекс для CompanyID и Time. Это позволит избежать касания строк <= '2015-04-10'. –
Tried 'Order By [Time]'; хуже, 29 секунд! – mshsayem