如何使用基于集合的操作重写此 SQL

问题描述

我将以下 SQL 查询作为 SQL Server 中存储过程的一部分。这需要将近 20 分钟的时间,有时运行时间更长。

我尝试用 CTE(通用表表达式)替换游标,并在以下查询中使用的表上拥有所有聚集和非聚集索引。

在完成所有这些之后,完成执行仍然需要很长时间。任何有关使以下查询执行得更快的帮助将不胜感激。在此先感谢大家提出宝贵的建议和意见。

 DECLARE @ID as INT;  
 DECLARE @MyCursor as CURSOR;  
   
 SET @MyCursor = CURSOR FOR  
     SELECT ID  
     FROM dbo.table1
   
 OPEN @MyCursor;  
 FETCH NEXT FROM @MyCursor INTO @ID;  
   
 WHILE @@FETCH_STATUS = 0  
 BEGIN  
     INSERT INTO table2(col1,col2,col3)  
         SELECT Rel.id,E.id2 AS col2,1 AS col3
         FROM table3 AS Rel 
         JOIN  
             (SELECT R1.col 1 AS col1,R2.col2 AS col2
              FROM   
                  (SELECT TT.col1,TT.col2
                   FROM table4 AS TT 
                   JOIN table5 As Th ON Th.id= TT.id
                   WHERE Th.id= @ID) AS R1  
              CROSS JOIN  
                  (SELECT TT.col1,TT.col2
                   FROM table4  AS TT 
                   JOIN table5 AS Th ON Th.id= TT.id
                   WHERE Th.id= @ID) AS R2  
              WHERE 
                  R1.ID <> R2.ID) AS E ON E.ID1 = Rel.ID  
                                                     AND NOT EXISTS (SELECT * 
                                                                     FROM table6 
                                                                     WHERE ID = Rel.ID AND ID = E.ID2)  
  
     FETCH NEXT FROM @MyCursor INTO @ID;  
END  
   
CLOSE @MyCursor;  
DEALLOCATE @MyCursor;

解决方法

我认为您可以通过让您的 CROSS JOIN 加入 all 组来移除光标,确保将 Tag 与正确的 GroupID 匹配,如以下代码段:

SELECT R1.col1,R2.col2 
FROM (
    SELECT t1.col1,t1.col2,t2.col1
    FROM table1 AS t1
    JOIN table2 As t2 ON t2.id= t1.id
    
) AS R1  
CROSS JOIN (
    SELECT t1.col1,t2.col1
    FROM table1 AS t1
    JOIN table2 AS t2 ON t2.id= t1.id
    
) AS R2  
WHERE R1.id<> R2.id
-- Ensure the Group is the same
AND R1.id= R2.id;

一旦在单个语句中工作,那么您就可以更好地对其进行性能调整。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...