下面显示的这个查询运行差不多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
我应该在此表上使用非聚集索引,还是我可以做些什么来减少执行时间?提前致谢
答案 0 :(得分:0)
首先,您在calculateprice
和top 1
子查询中不需要distinct
或exists
。但这不应影响性能。
这是查询,略有重新安排,以便我能更好地理解它:
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)
根据您描述的数据量,您的查询不应花费数小时。我认为索引可以提供帮助。