выполнение запроса занимает больше времени с выражением top и top - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть 2 таблицы, объединенные с оператором объединения всех в процедуре. Первая таблица содержит 20 миллионов записей, а вторая таблица содержит 1 миллион записей.если я использую только одно предложение Top без отдельного предложения, оно выдает результат, но когда я использовал предложение TOP с предложением Distinct, первые 800 записей возвращаются очень быстро после того, как этот запрос выполняется без завершения. Это правильный метод для использования обоих (Distinct и Top) в том же запросе?

SELECT Distinct TOP 1000
            TP.F_PRODUCT AS ID,
            TP.F_PRODUCT_NAME AS [NAME],
            TP.F_LANGUAGE AS LANGCODE,
            TP.F_FORMAT AS FMTCODE,
            TP.F_CUSTOM1 AS TN,
            TP.F_CUSTOM2 AS CP,
        FROM 
            T_PDF TP WHERE TP.F_PRODUCT <>''
    UNION ALL

    SELECT Distinct TOP 1000
            TP.F_PRODUCT AS ID,
            TP.F_PRODUCT_NAME AS [NAME],
            TP.F_LANGUAGE AS LANGCODE,
            TP.F_FORMAT AS FMTCODE,
            TP.F_CUSTOM3 AS TN,
            TP.F_CUSTOM4 AS CP,
        FROM 
            T_HTML TP WHERE TP.F_PRODUCT <>''

1 Ответ

0 голосов
/ 18 февраля 2019

Нет ничего плохого в использовании TOP и DISTINCT, независимо от существующей конструкции UNION ALL.Если вам нужны именно эти данные, то это способ сделать это.

Однако, когда вы запрашиваете DISTINCT, вы должны понимать, что системе, возможно, придется просмотреть много записей, чтобы убедиться в этом.выбирает достаточное количество необработанных данных, чтобы получить требуемое количество значений DISTINCT;в худшем случае это должно пройти все 20 миллионов записей!MSSQL довольно хорошо угадывает, сколько строк ему понадобится, используя статистику, имеющуюся в имеющихся данных.

Теперь, возможно, ваша статистика «далеко», из-за чего система выбирает «слишком мало»«записей, дающих эти 800« быстрых результатов », которые вы получаете, но затем тратите много времени на выборку следующих 200 (различных значений) из таблицы.

Я бы предложил попробовать сделать 2 вещи:

  • попросите приблизительный план и научитесь его интерпретировать
  • обновите статистику для указанных таблиц, а затем повторите попытку, посмотрите, изменился ли оценочный план;особенно интересным будет предполагаемое количество строк

Удачи, Роби

PS: имейте в виду, что при запросе TOP n вы получите «случайный выбор» извсе данные;нет никакой гарантии, что вы получите 'первые' n строк из таблицы!Для этого вам необходимо явно указать предложение ORDER BY, потенциально добавляя (много) дополнительную работу к выполнению запроса;снова, план запроса покажет это.(Вы можете набрать оба запроса одновременно и запросить примерный план, чтобы увидеть различия. При этом если один запрос стоит 10%, а другой - 90%, это не означает, что один запрос будет выполняться в 9 раз быстрее, чемс другой стороны, стоимость не совпадает со временем, хотя между ними действительно есть связь, но не линейная)

...