2013-06-28 98 views
0

我有SQL Server連接性能問題,有多列比較。SQL Server JOIN性能

SELECT T1.* FROM T1, T2 
WHERE T1.LASTNAME = T2.LASTNAME AND 
T1.FIRSTNAME = T2.FIRSTNAME AND 
T1.MIDDLENAME = T2.MIDDLENAME AND 
DAY(T1.DoB) = T2.DOBDay AND 
MONTH(T1.DoB) = T2.DOBMonth 

這些表中的每個表都超過20,000條記錄,這確實會導致性能問題。 我跑了它,它需要超過6分鐘,所以我取消了!

有沒有辦法提高該聲明的性能?

+0

你對這兩個表有什麼指數?執行計劃說什麼? – peterm

+0

檢查兩個表的where子句中所有字段的索引! – Anshuman

+0

在最壞的情況下,在任何一個表上都沒有索引,T1中的每行20,000行需要與T2中的20,000行進行比較,從而產生一組40000行的工作集。要確定這個問題是在屏幕後面而不是在它之前,請提供一些可用索引的描述。 –

回答

0

你必須創建以下之前你都非表簇索引..

CREATE NONCLUSTERED INDEX IX_First_Middle_T2 ON T2 (FIRSTNAME,MIDDLENAME); 

現在運行下面的查詢

SELECT T1.*,DAY(T1.DOB) as DOBDay, MONTH(T1.DOB) as DOBMonth INTO #T1 
CREATE NONCLUSTERED INDEX IX_First_Middle_T1 ON #T1 (FIRSTNAME,MIDDLENAME); 

SELECT T1.* 
FROM #T1 T1 
JOIN T2 
ON T1.LASTNAME  = T2.LASTNAME 
and T1.FIRSTNAME = T2.FIRSTNAME 
and T1.MIDDLENAME = T2.MIDDLENAME 
and T1.DOBDay  = T2.DOBDay 
and T1.DOBMonth = T2.DOBMonth 

上面的查詢提供了兩個額外的包含月份和日期的列,而不是T1。*將其替換爲列名稱。

2

因爲你只需要從您可以使用左T1表數據加入或存在條款。

select T1.* 
    from T1 
    where 
     exists (
        select 1 
        from T2 
        where 
        T1.LASTNAME = T2.LASTNAME 
        and T1.FIRSTNAME = T2.FIRSTNAME 
        and T1.MIDDLENAME = T2.MIDDLENAME 
        and DAY(T1.DoB) = T2.DOBDay 
        and MONTH(T1.DoB) = T2.DOBMonth 
      ) 
+0

你好,我剛剛試了一下,表現似乎變得更糟。執行時間加倍 – James