簡體   English   中英

SQL Join花費太多時間來運行

[英]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 ExistsLeft 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 1distinctexists ,並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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM