2015-06-05 5 views
0

В базе данных это время опрашивается против содержит несколько миллионов записей - просто интересно, если следующий запрос может быть оптимизирован на всехSQl Оптимизация Где существует

SELECT Count(DISTINCT [t0].[gUserId]) AS [UserId] 
FROM [Plan] AS [t0] 
WHERE EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM [Entry] AS [t1] 
    WHERE ([t1].[PlanId] = ([t0].[id])) 
    AND ([t1].[EntryMobile] = 1) AND (NOT ([t0].[Deleted] = 1))) 
+1

Почему вы спрашиваете, работает ли он плохо? Правильно ли указаны столбцы, которые вы указали? Вы проверили план выполнения для узких мест? Нужна дополнительная информация. – JiggsJedi

+0

Часть WHERE может быть оптимизирована с использованием индексов. Если вы создаете индекс покрытия (все поля включены - planid, entrymobile) на t1, то следующей худшей частью будет COUNT (DISTINCT). Уверен, что вам нужно также включить индекс (id, deleted, guserid) на t0. – Arvo

+3

@HellBaby Я не согласен с вышеприведенным утверждением о том, что соединения в 4K раз быстрее, чем инструкция существования ... Мне бы хотелось увидеть некоторые доказательства этого https://stackoverflow.com/questions/7082449/exists-vs-join- and-use-of-exist- – JiggsJedi

ответ

0

Здесь находятся еще два запроса, которые выдают такие же, как у вас:

1.

SELECT Count(DISTINCT [t0].[gUserId]) AS [UserId] 
    FROM [Plan] AS [t0] 
     CROSS APPLY (SELECT TOP 1 1 X 
      FROM [Entry] AS [t1] 
      WHERE [t1].[PlanId] = [t0].[id] 
       AND [t1].[EntryMobile] = 1) t1 
    WHERE [t0].[Deleted] <> 1 

2.

SELECT Count(DISTINCT [t0].[gUserId]) AS [UserId] 
    FROM [Plan] AS [t0] 
    WHERE [t0].[Deleted] <> 1 
     AND [t0].[id] IN (SELECT [PlanId] 
      FROM [Entry] 
      WHERE [EntryMobile] = 1) 

Я подозреваю, что № 2 является самым быстрым из всех, но не сильно.

Чтобы проверить, объедините их все вместе в одной группе SQL из Studio SQL Server Management, с параметром «Включить фактический план выполнения», затем сравните планы выполнения, чтобы узнать, какой из них оптимален. Иногда он скажет вам, отсутствует ли указатель.

Смежные вопросы