2021-07-30

SQL query containing cursors and cross join taking too long to execute

I have below SQL query as part of a stored procedure in SQL Server. This is taking almost 20 minutes and sometimes more to run.

I tried to replace cursors with CTE (Common Table Expression) and have all the clustered and nonclustered indexes on the tables used in the below query.

After having all that, it is still taking too long to finish execution. Any help on making the below query execute faster would be highly appreciated. Thank you all in advance for your valuable suggestions and comments.

 DECLARE @GroupID as INT;  
 DECLARE @MyCursor as CURSOR;  
   
 SET @MyCursor = CURSOR FOR  
     SELECT GroupID  
     FROM dbo.ThesGroup  
   
 OPEN @MyCursor;  
 FETCH NEXT FROM @MyCursor INTO @GroupID;  
   
 WHILE @@FETCH_STATUS = 0  
 BEGIN  
     INSERT INTO dbo.PartTagRel (PartID, PartTagID, IsThesaurus)  
         SELECT Rel.PartID, E.PartTagID2 AS PartTagID, 1 AS IsThesaurus   
         FROM dbo.PartTagRel AS Rel 
         JOIN  
             (SELECT R1.PartTagID AS PartTagID1, R2.PartTagID AS PartTagID2 
              FROM   
                  (SELECT TT.PartTag, TT.PartTagID 
                   FROM dbo.ThesTag AS TT 
                   JOIN dbo.Thesaurus As Th ON Th.ThesTagID = TT.ThesTagID  
                   WHERE Th.ThesGroupID = @GroupID) AS R1  
              CROSS JOIN  
                  (SELECT TT.PartTag, TT.PartTagID 
                   FROM dbo.ThesTag AS TT 
                   JOIN dbo.Thesaurus AS Th ON Th.ThesTagID = TT.ThesTagID  
                   WHERE Th.ThesGroupID = @GroupID) AS R2  
              WHERE 
                  R1.PartTagID <> R2.PartTagID) AS E ON E.PartTagID1 = Rel.PartTagID  
                                                     AND NOT EXISTS (SELECT * 
                                                                     FROM dbo.PartTagRel 
                                                                     WHERE PartID = Rel.PartID AND PartTagID = E.PartTagID2)  
  
     FETCH NEXT FROM @MyCursor INTO @GroupID;  
END  
   
CLOSE @MyCursor;  
DEALLOCATE @MyCursor;


from Recent Questions - Stack Overflow https://ift.tt/3ycGKnL
https://ift.tt/eA8V8J

No comments:

Post a Comment