简体   繁体   中英

SQL Join taking too much time to run

This query shown below is taking almost 2 hrs to run and I want to reduce the execution time of this query. Any help would be really helpful for me.

Currently:

If Exists (Select 1                                
           From PRODUCTS prd                                
           Join STORE_RANGE_GRP_MATCH srg On prd.Store_Range_Grp_Id = srg.Orig_Store_Range_Grp_ID          
                                          And srg.Match_Flag = 'Y'
                                          And prd.Range_Event_Id = srg.LAR_Range_Event_Id
           Where srg.Range_Event_Id Not IN (Select distinct Range_Event_Id
                                            From Last_Authorised_Range)
          )       

I have tried replacing the Not IN clause by Not Exists and Left join but no luck in runtime execution.

What I have used:

If Exists(   Select top 1 *                           
      From PRODUCTS prd                               
      Join STORE srg                             
      On  prd.Store_Range_Grp_Id = srg.Orig_Store_Range_Grp_ID                                
      And  srg.Match_Flag  = 'Y'                                
      And  prd.Range_Event_Id = srg.LAR_Range_Event_Id 
and           srg.Range_Event_Id ='45655'        



Where NOT EXISTS (Select top 1 *                                  
       From Last_Authorised_Range where Range_Event_Id=srg.Range_Event_Id)                             
 )  

Product table has 432837 records and the Store table also has almost the same number of records. This table I am creating in the stored procedure itself and then dropping it in the end in the stored procedure.

Create Table PRODUCTS                                 
(                                
     Range_Event_Id int,                                 
     Store_Range_Grp_Id int,                                
     Ranging_Prod_No nvarchar(14) collate database_default,
     Space_Break_Code nchar(1) collate database_default
)                     

Create Clustered Index Idx_tmpLAR_PRODUCTS 
   ON PRODUCTS (Range_Event_Id, Ranging_Prod_No, Store_Range_Grp_Id, Space_Break_Code)

Should I use non clustered index on this table or what all can I do to lessen the execution time? Thanks in advance

First, you don't need top 1 or distinct in exists and in subqueries. But this shouldn't affect performance.

This is the query, slightly re-arranged so I can understand it better:

Select 1                          
From PRODUCTS prd Join
     STORE srg                             
     On prd.Store_Range_Grp_Id = srg.Orig_Store_Range_Grp_ID and
        prd.Range_Event_Id = srg.LAR_Range_Event_Id                             
Where srg.Match_Flag  = 'Y'                                
      srg.Range_Event_Id = 45655 and   
Where NOT EXISTS (Select 1                                
                  From Last_Authorised_Range lar
                  where lar.Range_Event_Id = srg.Range_Event_Id)                             
                 )

Do note that I removed the double quotes around 45655 . I presume this column is actually a number. If so, don't confuse yourself and the optimizer by using a string for the comparison.

Then, try indexes. I think the best indexes are:

  • store(Range_Event_Id, Match_Flag, Orig_Store_Range_Grp_ID, LAR_Range_Event_Id)
  • products(Store_Range_Grp_Id, Range_Event_Id) (or any index, clustered or otherwise, that starts with these two columns in either order)
  • Last_Authorised_Range(Range_Event_Id)

From what you describe as the volume of data, your query should not be taking hours. I think indexes can help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM