2014-06-10 106 views
0

在我的數據庫中,我有一個名爲FinanceProfile的表。它有一個名爲FinanceProfileId的列。INNER JOIN佔用太多時間

我有另一個名爲FinanceProfileState的表。此表有一個名爲FinanceProfileId的外鍵,該外鍵引用了FinanceProfile表中的記錄。

我已經存儲的過程,其執行以下操作: -

我有一個臨時表稱爲@MatchingContactFinancialProfiles。

DECLARE @MatchingContactFinancialProfiles TABLE 
( 
    FinanceProfileId int, 
    ContactId uniqueidentifier 
); 

@MatchingContactFinancialProfiles包含FinanceProfile表的子集。它包含大約100行。

FinanceProfileState表格與@MatchingContactFinancialProfiles約有4500匹配的行。

我做一個加入這樣的:

INSERT INTO @FinanceProfileStates 
     SELECT distinct fpState.FinanaceProfileId, fpState.StateId 
      FROM @MatchingContactFinancialProfiles fp inner JOIN FinanaceProfileState fpState 
      on fp.FinanceProfileId = fpState.FinanaceProfileId 

我跑了探查,並從右說向左:

Step 1: Table Scan @MatchingContactFinancialProfiles - Cost 5% 
Step 2: A) Hash Match Aggregate- 19% 
     B) Clustered Index Scan - Table - FinanaceProfileState PK - FinanaceProfileStateId - 15% 
Step 3: Hash Match - Inner Join - 38% 
Step 4: Distinct Sort - 15% 
Step 5: Insert @FinanceProfileStates - 8% 

這個查詢佔據了大部分的時間在存儲過程。我能做些什麼來使這個查詢運行得更快?

歡迎任何想法和建議!

回答

1

您的@MatchingContactFinancialProfiles表變量沒有任何索引。

使用try

DECLARE @MatchingContactFinancialProfiles TABLE 
( 
    FinanceProfileId int PRIMARY KEY, 
    ContactId uniqueidentifier 
); 

根據這一link,你也可以使用一個臨時表,而不是你目前正在使用的表變量獲得更好的性能。

+0

已經大大縮短了時間。感謝您的輸入。但是,我希望它少一點。一般來說,當我們加入表格時,是否有一個縮略圖規則可以讓它更快,例如在我們使用的列上使用索引。 – SaiBand

+0

我總是嘗試加入索引列。如果'fpState.FinanaceProfileId'沒有被索引,那麼你應該添加一個。 – DeanOC