Динамическая вставка во временный запрос зависает на часы - PullRequest
0 голосов
/ 23 июня 2018
INSERT INTO #TEMP(ID,CID,STS,ETL_NBR,T_ID)
    SELECT STG.ID,STG.CID,STG.STS,STG.ETL_NBR,STG.T_ID 
    FROM DBO.A_STAGE STG(NOLOCK) 
    INNER JOIN DBO.A_PRE PRE(NOLOCK)
    ON PRE.ID=STG.ID AND PRE.CID=STG.CID 
    WHERE PRE.STS = 'D'
    AND STG.ETL_NBR < PRE.ETL_NBR

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

1) Если я выполняю SELECT на основании вышеуказанных условий, запрос все равно приводит к 0 записям.Для вставки он висит часами.

2) В этом запросе нет блокировщиков.

Примечание. Поскольку это динамический запрос, когда другие таблицы передаются переменным, этот запрос выполняется гладко.Это проблема только с конкретной таблицей.Я обновил статистику и перестроил индекс для этой таблицы.Бесполезно

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

PRE.CID = STG.CID

Это конкретное объединение имеет NULL и пробелы.Это не уникальный или PK столбец.Отсюда и медлительность.Я исключил их в Join, добавив PRE.CID NOT NULL.

Запрос теперь выполняется быстро.

0 голосов
/ 23 июня 2018

Это может быть классический Параметр Sniffing , вы можете прочитать больше здесь: Что такое параметр-сниффинг

Существует способ повысить производительность с помощью таких запросов, используя OPTION (RECOMPILE) в вашем запросе

Вам нужно включить в конце запроса
Вы также можете использовать UNKNOWN для каждой переменной, например:

OPTION (OPTIMIZE FOR (@variable 1UNKNOWN, @variable2 UNKNOWN, ....))

Вы можете прочитать больше здесь: улучшение-запрос-производительность-с-опцией-перекомпилировать-константу-сворачивание-и-избегание-параметра-сниффинг-проблемы /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...