Перепишите запрос SQL - PullRequest
       1

Перепишите запрос SQL

0 голосов
/ 24 октября 2018

Этот динамический SQL-запрос каждый раз зависает на prod.Я должен переписать это.Может кто-нибудь, пожалуйста, упростить это.Индексы на месте.Проблема в том, что запрос очень сложен, а записи исчисляются миллионами.

SET @SQL_NVAR=N'INSERT INTO #RECS_TEMP_TABLE (ROW_ID, STATUS)
    SELECT A.ROW_ID, ' + CONVERT(VARCHAR(10), @DUP1_EXCPT_STAT) + '
    FROM ' + @TABLE_NAME_SRC + ' A (NOLOCK) 
    WHERE NOT EXISTS (SELECT 1 FROM #RECS_TEMP_TABLE R WHERE A.ROW_ID = R.ROW_ID )
    AND ENTY_ID=''' + @ENTY_ID + ''' 
    AND NOT EXISTS (
      SELECT 1 FROM (
        SELECT AA.ROW_ID FROM ' + @TABLE_NAME_SRC + ' AA(NOLOCK) 
        INNER JOIN (SELECT HASH_CD, MAX(ROW_ID) ROW_ID FROM '+ @TABLE_NAME_SRC + '(NOLOCK) 
          GROUP BY HASH_CD HAVING COUNT(*)>1 
        ) BB ON AA.HASH_CD = BB.HASH_CD AND AA.ROW_ID = BB.ROW_ID 
        WHERE ENTY_ID=''' + @ENTY_ID + ''' 
      ) CC WHERE A.ROW_ID = CC.ROW_ID) 
      AND NOT EXISTS (
        SELECT 1 FROM (
          SELECT AA.ROW_ID FROM ' + @TABLE_NAME_SRC + ' AA(NOLOCK)  
          INNER JOIN 
          (SELECT HASH_CD, MAX(ROW_ID) ROW_ID FROM '+ @TABLE_NAME_SRC + '(NOLOCK) 
           GROUP BY HASH_CD HAVING COUNT(*)=1 
          ) BB ON AA.HASH_CD = BB.HASH_CD AND AA.ROW_ID = BB.ROW_ID 
          WHERE ENTY_ID=''' + @ENTY_ID + ''' 
        ) CC WHERE A.ROW_ID = CC.ROW_ID
      ) ORDER BY ROW_ID '

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Я считаю, что это упрощенная версия, которая должна работать быстрее, но факт заключается в том, что медленные запросы могут быть вызваны множеством других факторов, помимо запроса.Вам действительно нужно предоставить полные определения таблиц с индексами и планом выполнения.Кроме того, вы должны проиндексировать временную таблицу, если вы еще этого не сделали.

INSERT INTO #RECS_TEMP_TABLE (ROW_ID, STATUS)
    SELECT A.ROW_ID, ' + CONVERT(VARCHAR(10), @DUP1_EXCPT_STAT) + '
    FROM ' + @TABLE_NAME_SRC + ' A (NOLOCK)
    LEFT JOIN #RECS_TEMP_TABLE R ON A.ROW_ID = R.ROW_ID
    LEFT JOIN ' + @TABLE_NAME_SRC + ' CC (NOLOCK) ON A.HASH_CD = CC.HASH_CD
        AND A.ROW_ID = CC.ROW_ID
        AND A.ENTY_ID = =''' + @ENTY_ID + '''
    WHERE ENTY_ID=''' + @ENTY_ID + ''' 
    AND R.ROW_ID IS NULL
    AND CC.HASH_CD IS NULL
0 голосов
/ 24 октября 2018

MSSQL имеет инструменты, которые помогают оптимизировать запросы.

Я почти уверен, что никто не сможет оптимизировать ваш запрос без дополнительной информации (структура таблиц, созданные индексы, пример сгенерированного запроса и т. д.).

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