1

ОБНОВЛЕНИЕ

Я думаю, что преждевременно спрашивать об этом. После нескольких тестов я узнал, что производительность не улучшилась. Я буду выполнять еще несколько тестов и опубликовать обновления здесь. До этого не беспокойтесь, чтобы ответить на это.SQL Query UNION Performance

У меня был запрос, как это ...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo 
         UNION 
         SELECT boTemp.[Id] 
         FROM [#BusinessObject_Table] boTemp) 

Этот запрос принимает навсегда для запуска для значительного набора данных. Я также добавил индекс CLUSTERED в столбце Id таблиц Temp, что дало некоторое увеличение производительности, но все же не удалось завершить.

я заменил этот запрос с этим ...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo) 
     AND [Field_A] NOT IN (SELECT boTemp.[Id] 
          FROM [#BusinessObject_Table] boTemp) 

Это завершено в секундах. Может кто-нибудь объяснить, что здесь произошло?

ОБНОВЛЕНИЯ: Я думал, что оба вопроса одинаковы. Это то, что мне нужно.

BusinessObject_Table has following Ids: 1, 2, 3

#BusinessObject_Table has: 3, 4, 5

TempTable has rows whose Field_A values are: 1, 2, 3, 4, 6

Результат запроса должен быть: 6 (изменить примечание в приведенном выше запросе)

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

+1

Пожалуйста, опубликуйте планы. Запросы все равно делают разные вещи. Второй проверяет, что он не отображается в обеих таблицах. Первая таблица. Первому нужно будет использовать 'intersect' или 2-й или' to одинаковый. –

ответ

3

угадывания при отсутствии планов запросов ...

СОЮЗ подзапрос вынуждает DISTINCT. С отдельными предложениями IN этого избежать. Однако, логика отличается между запросами (Edit: как отметил Мартин Смит)

С UNION ALL и единственный в ней должно быть лучше, если это логика вы хотите

WHERE [Field_A] NOT IN (SELECT bo.[Id] 
        FROM [BusinessObject_Table] bo 
        UNION ALL 
        SELECT boTemp.[Id] 
        FROM [#BusinessObject_Table] boTemp) 
2

Я думаю, что вы должны сделать ваш запрос таким образом:

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE NOT EXISTS(
    SELECT 1 FROM BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) AND NOT EXISTS(
    SELECT 1 FROM #BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) 

Таким образом, SQL Server может использовать свой оптимизатор, вероятно, немного лучше, чем ваш запрос UNIONed. Вполне возможно, что оптимизатор будет выбирать ваш запрос в другом порядке, исходя из ваших стратегий индексирования и размеров таблиц. Скорее всего, это будет самый быстрый способ сделать это. Хотя, без отображения структуры таблицы и индексов и планов выполнения, трудно быть уверенным.

+0

Спасибо за это. Запрос выполняется быстро. Я проверю это и опубликую больше комментариев здесь позже (вместе с планами исполнения) – Zuber