问题描述
我将以下 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;
一旦在单个语句中工作,那么您就可以更好地对其进行性能调整。