[英]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 Exists
和Left 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 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)
(或任何索引,无论是聚集索引还是其他索引,都以这两个列中的products(Store_Range_Grp_Id, Range_Event_Id)
开头) Last_Authorised_Range(Range_Event_Id)
从您所描述的数据量来看,您的查询应该不会花费数小时。 我认为索引可以提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.