[英]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.