SQL Join需要花费太多时间来运行

时间:2016-03-10 11:10:29

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

下面显示的这个查询运行差不多2小时,我想减少这个查询的执行时间。任何帮助对我都有帮助。

目前:

decoded

我尝试用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 IN替换Not Exists子句,但在运行时执行中没有运气。

我用过的东西:

Left join

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) ) 表有432837条记录,Product表也有几乎相同的记录数。我在存储过程本身创建的这个表,然后将它放在存储过程的最后。

Store

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

1 个答案:

答案 0 :(得分:0)

首先,您在calculatepricetop 1子查询中不需要distinctexists。但这不应影响性能。

这是查询,略有重新安排,以便我能更好地理解它:

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)

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