SQL Server中长时间运行的联接需要花费大量时间

SQL Server中长时间运行的联接需要花费大量时间,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,下面的查询需要3个多小时。表LAR_PRODUCTS和STORE_RANGE_GRP_MATCH是物理表 行: 拉鲁产品:432837 门店范围玻璃钢匹配:103 038 最后授权范围:366 026 SQL: 目前的指数是 Create Clustered Index Idx_tmpSTORE_RANGE_GRP_MATCH ON STORE_RANGE_GRP_MATCH (LAR_Range_Event_Id, Orig_Store_Range_Grp_ID) 首先,您可以将NO

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

行:

  • 拉鲁产品:432837
  • 门店范围玻璃钢匹配:103 038
  • 最后授权范围:366 026
SQL:

目前的指数是

Create Clustered Index Idx_tmpSTORE_RANGE_GRP_MATCH 
ON STORE_RANGE_GRP_MATCH (LAR_Range_Event_Id, Orig_Store_Range_Grp_ID) 

首先,您可以将
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
接下来,在查询中涉及的每一列上创建一些索引不会有什么坏处,这样可以加快它们之间的任何比较

  • 存储范围的索引\u GRP\u匹配(根据用户的建议TT.

    在STORE\u RANGE\u GRP\u MATCH上创建非聚集索引STORE\u RANGE\u GRP\u idx1(Orig\u STORE\u RANGE\u GRP\u ID、LAR\u RANGE\u Event\u ID、MATCH\u标志)

  • 拉鲁产品指数:

    在LAR_产品上创建非聚集索引LAR_产品\u idx1(存储\u范围\u Grp\u Id,范围\u事件\u Id)


希望这有帮助

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

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

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

如果不了解您的表和索引并查看查询计划,我们就无法真正判断发生了什么。粘贴查询的执行计划..猜测一下,在联接列上添加所需索引,并使用
不存在
而不是
不在
中-您没有提到上次授权范围内有多少记录
@Nick.McDermaid上次授权范围内的记录数为366026。聚集索引已经存在于联接表中。我希望你知道NOLOCK的好坏。当前索引是这样创建的:-创建聚集索引Idx\u tmpSTORE\u RANGE\u GRP\u MATCH on STORE\u RANGE\u GRP\u MATCH(LAR\u RANGE\u Event\u Id,Orig\u STORE\u RANGE\u GRP\u Id)我是否应该将聚集索引更改为非聚集索引?@SumitDwivedi我建议使用非聚集索引,因为我假设表中已经存在一个索引。在我看来,您不应该将我建议的索引更改为聚集索引。将表中存在的聚集索引保留在那里,然后创建我支持的非聚集索引。很有可能更好的方法是在原始存储区范围Grp ID、LAR范围事件ID、,根据Match_Flag='Y'进行筛选,但我们确实需要了解更多关于现有查询计划的信息,并且这些表上已经存在dataClustered索引。我应该使用非聚集索引吗?聚集索引通常最适合表示使每行唯一的列。也就是说,如果您拥有的聚集索引位于完全相同的列上,那么您可以这样保留它。否则,您应该如上所述创建新的非聚集索引。非聚集索引更适合于可能具有重复值的列,并用作指向表中每一行的快速指针。
CREATE NONCLUSTERED INDEX srg_id_event_flag ON STORE_RANGE_GRP_MATCH(Orig_Store_Range_Grp_ID,LAR_Range_Event_Id,Match_Flag);