Sql server 重写SQL查询

Sql server 重写SQL查询,sql-server,database-performance,Sql Server,Database Performance,此动态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

此动态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 '

MSSQL有一些工具,可以帮助查询优化

  • 用于捕获执行的查询之一
  • 用于理解,如何使用 执行查询的服务器
  • 使用,这将帮助您找到 其他一些索引,该服务器将用于执行 询问

我敢肯定,没有更多信息(表结构、创建的索引、生成的查询示例等),没有人能够优化您的查询。

我相信这是一个简化版本,应该运行得更快,但事实是,查询速度慢可能是由查询以外的许多因素造成的。您确实需要提供带有索引和执行计划的完整表定义。此外,如果尚未建立临时表,则应为临时表编制索引

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

缩进和新行是你的朋友。现在读起来很痛苦,一件事是第二个不存在的东西和第一个几乎一样。如果将第一个设置为“COUNT()=>1”而不是“COUNT()>1”,则可以消除整个第二个设置不存在的情况。感谢您的回复。我没有注意到前一个开发人员为了保持代码模块性和需求完整性而将它们分开的部分。我已将其修改为count(1)>=1I将对此进行尝试,并让您知道结果。谢谢你的帮助