SQL Server中的长时间连接需要花费大量时间

时间:2016-02-09 10:57:04

标签: sql sql-server sql-server-2005

以下查询需要3个小时。表LAR_PRODUCTS和STORE_RANGE_GRP_MATCH是物理表。

行:

  • LAR_PRODUCTS:432 837
  • STORE_RANGE_GRP_MATCH:103 038
  • Last_Authorised_Range:366 026

SQL:

Select 1 
From
    LAR_PRODUCTS prd with (nolock)                              
Join
    STORE_RANGE_GRP_MATCH srg with (nolock) 
    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 Range_Event_Id
                               From Last_Authorised_Range)

当前索引是

Create Clustered Index Idx_tmpSTORE_RANGE_GRP_MATCH 
ON STORE_RANGE_GRP_MATCH (LAR_Range_Event_Id, Orig_Store_Range_Grp_ID) 

2 个答案:

答案 0 :(得分:0)

首先,您可以将NOT IN子句替换为LEFT JOIN,如下所示:

SELECT 1                                  
  FROM LAR_PRODUCTS prd    WITH (nolock)                              
  JOIN STORE_RANGE_GRP_MATCH srg WITH (nolock)                                 
  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 
  LEFT JOIN Last_Authorised_Range lar
  ON srg.Range_Event_Id = lar.Range_Event_Id
  WHERE lar.Range_Event_Id IS NULL

接下来,在查询中涉及的每一列上创建一些索引都不会有什么坏处,所以加快它们之间的任何比较。

  • STORE_RANGE_GRP_MATCH上的索引(由用户 TT。友好建议)

      

    创建NONCLUSTERED INDEX STORE_RANGE_GRP_MATCH_idx1 ON STORE_RANGE_GRP_MATCH(Orig_Store_Range_Grp_ID,LAR_Range_Event_Id,Match_Flag);

  • LAR_PRODUCTS索引:

    CREATE NONCLUSTERED INDEX LAR_PRODUCTS_idx1 ON LAR_PRODUCTS(Store_Range_Grp_Id,Range_Event_Id);

希望这有帮助!

答案 1 :(得分:0)

您可能缺少加快查询速度的索引。想到的一个候选INDEX是:

CREATE NONCLUSTERED INDEX srg_id_event_flag ON STORE_RANGE_GRP_MATCH(Orig_Store_Range_Grp_ID,LAR_Range_Event_Id,Match_Flag);

执行该语句,然后再次运行查询。它可能会提高性能。