繁体   English   中英

SQL Join花费太多时间来运行

[英]SQL Join taking too much time to run

下面显示的该查询将花费近2个小时来运行,我想减少该查询的执行时间。 任何帮助都会对我有很大帮助。

目前:

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)
          )       

我尝试用Not ExistsLeft join代替Not IN子句,但是在运行时执行时没有运气。

我用过的

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表具有432837条记录,而Store表也​​具有几乎相同数量的记录。 我在存储过程本身中创建此表,然后将其最后放入存储过程中。

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)

我应该在此表上使用非聚集索引还是可以做些什么以减少执行时间? 提前致谢

首先,你不需要top 1distinctexists ,并in子查询。 但这不应该影响性能。

这是查询,稍作重新排列,因此我可以更好地理解它:

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)                             
                 )

请注意,我删除了45655附近的双引号。 我认为此列实际上是一个数字。 如果是这样,请不要通过使用字符串进行比较来混淆自己和优化器。

然后,尝试索引。 我认为最好的指标是:

  • store(Range_Event_Id, Match_Flag, Orig_Store_Range_Grp_ID, LAR_Range_Event_Id)
  • products(Store_Range_Grp_Id, Range_Event_Id) (或任何索引,无论是聚集索引还是其他索引,都以这两个列中的products(Store_Range_Grp_Id, Range_Event_Id)开头)
  • Last_Authorised_Range(Range_Event_Id)

从您所描述的数据量来看,您的查询应该不会花费数小时。 我认为索引可以提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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