首页 > 解决方案 > 调整 SQL Server 查询

问题描述

我的目标是清除块中的数据,并考虑在将 ID_COl 值放入 #temptable 后循环遍历它。

    DECLARE @PD datetime = DATEADD(day, -5, GETUTCDATE());
DELETE GP
  FROM dbo.Table_A N
 INNER JOIN dbo.Table_BL GP
    ON N.NOTIF_ID = GP.NOTIF_ID
 WHERE N.FCT_AUD_IND = 'Y'
   AND N.CRE_TMST    < @PD
   AND EXISTS (   SELECT 1 ID_COl
                    FROM dbo.Table_A AS N1
                   WHERE N1.NOTIF_APPL_ID        = N.NOTIF_APPL_ID
                     AND N1.SOR_NOTIF_APPL_GP_ID = N.SOR_NOTIF_APPL_GP_ID
                     AND N1.NOTIF_DLT_IND  = 'Y');

标签: sqlsql-serverquery-optimizationsql-tuning

解决方案


您正在强制 SQL Server 执行嵌套循环以查找 Table_A 中的记录,但是当您让他决定并改为 JOIN 时,SQL Server 可能会找到更好的方法:

DECLARE @PD datetime = DATEADD(day, -5, GETUTCDATE());
WITH N1 AS (
  SELECT DISTINCT NOTIF_APPL_ID, SOR_NOTIF_APPL_GP_ID
  FROM dbo.Table_A
  WHERE NOTIF_DLT_IND  = 'Y'
)
DELETE GP
FROM dbo.Table_A N
  INNER JOIN N1 ON N.NOTIF_APPL_ID = N1.NOTIF_APPL_ID 
               AND N.SOR_NOTIF_APPL_GP_ID = N1.SOR_NOTIF_APPL_GP_ID
  INNER JOIN dbo.Table_BL GP ON N.NOTIF_ID = GP.NOTIF_ID
WHERE N.FCT_AUD_IND = 'Y'
   AND N.CRE_TMST < @PD

此外,定义索引可能会有所帮助。


推荐阅读