【发布时间】:2016-06-25 04:41:49
【问题描述】:
下面显示的这个查询需要将近 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)
我应该在这个表上使用非聚集索引还是我可以做些什么来减少执行时间?提前致谢
【问题讨论】:
-
PRIMARY KEY中的PRODUCTS在哪里? -
将
Select distinct Range_Event_Id From Last_Authorised_Range的结果放在一个表变量中,并在上面使用不存在。 -
删除
top 1和/或distinct子句 -exists()和in()没有这些会更好。您可以使用select *而不是select 1- 更好的可读性; SQL 优化器为这些生成相同的查询计划。在所有 ID 字段上创建索引。 -
尝试将
Where srg.Range_Event_Id Not IN (Select distinct Range_Event_Id From Last_Authorised_Range重写为LEFT OUTER JOIN Last_Authorised_Range ON Range_Event_Id = srg.Range_Event_Id并更改WHERE子句WHERE Range_Event_Id IS NULL。 -
你有其他表的索引吗?
标签: sql sql-server sql-server-2005