2012-05-28 38 views
0

我的SELECT查詢是:選擇查詢隨着提示的添加性能

Select A.DocumentID, 
     A.CodingID, 
     A.DebitPrice, 
     A.CreditPrice, 
     A.DocumentDetailDescriptionID, 
     A.HKSID, 
     A.OldInc, 
     A.EffectiveDate, 
     A.DetailedAccount1ID, 
     A.DetailedAccount2ID, 
     A.DetailedAccount3ID, 
     C.FinancialPeriodID, 
     C.SalesCompanyID, 
     B.[Date] 
From acc.DocumentDetail A 
INNER JOIN ACC.Document B ON B.DocumentID = A.DocumentID 
INNER JOIN ORG.SalesCompanyFinancialPeriod C ON C.SalesCompanyFinancialPeriodID = B.SalesCompanyFinancialPeriodID 

acc.DocumentDetail有關於12917388記錄

acc.documet有大約131767紀錄

org.SalesCompanyFinancialPeriod具有約93記錄

我的查詢很慢,我想讓它更快。我必須使用什麼提示?

+4

提示?關於用於連接的列的索引怎麼樣? –

+0

你沒有where子句,所以你至少要檢索1200萬條記錄 - 它有多慢? – Blorgbeard

+0

1-創建非結束索引[IX_DocumentDetail_DocumentID] ON [ACC]。[DocumentDetail]([DocumentID] ASC)ON [PRIMARY] –

回答

1

有關於兩個重要問題這種情況下:

  1. 你打算取得整體最佳性能還是想要更快地返回第一行(更適合UI應用程序)?
  2. 表org.SalesCompanyFinancialPeriod的行爲像過濾器字典

如果你正在尋找更好的整體時間和SalesCompanyFinancialPeriod像字典一樣,最好的性能可以通過使用合併來實現加入文檔和DocumentDetail和,然後之間,使用散列連接到SalesCompanyFinancialPeriod。

SELECT (...) 
FROM acc.Document doc 
INNER MERGE JOIN acc.DocumentDetail det ON (...) 
INNER HASH JOIN org.SalesCompanyFinancialPeriod fnp ON (...) 
OPTION(FORCE ORDER); 

如果SalesCompanyFinancialPeriod就像一個過濾器或該查詢中使用到UI應用程序,你可以通過這個表開始,然後使用LOOP/HASH與文檔,然後加入返回第一行要快得多,再次,另一個LOOP/HASH加入DocumentDetail。 LOOP或HASH之間的選擇加盟取決於許多環境變量,所以我寧願指定的順序JOIN和讓發動機選擇加盟:

SELECT (...) 
FROM org.SalesCompanyFinancialPeriod fnp 
INNER JOIN acc.Document doc ON (...) 
INNER JOIN acc.DocumentDetail det ON (...) 
OPTION(FORCE ORDER); 

比爲提示查詢性能更重要的是,儘管如此,這些表格的索引結構。對於這個查詢很重要,我會建議以下索引(對於這兩種用法都適用):

CREATE UNIQUE CLUSTERED INDEX idxc_det 
    ON acc.DocumentDetail(DocumentID, CodingID); 

CREATE UNIQUE CLUSTERED INDEX idxc_doc 
    ON acc.Document(DocumentID); 

CREATE INDEX idx_fnper 
    ON acc.Document(SalesCompanyFinancialPeriodID); 

CREATE UNIQUE CLUSTERED INDEX idxc_doc 
    ON org.SalesCompanyFinancialPeriod(SalesCompanyFinancialPeriodID); 
0

謝謝大家。

我調查我的查詢和SalesCompanyFinancialPeriod添加索引關於SalesCompanyFinancialPeriodID和包括SalesCompanyID & FinancialID 和改變我的查詢下面(這個查詢大約是1:10更快)

Select A.DocumentID, 
    A.CodingID, 
    A.DebitPrice,   
    A.CreditPrice,   
    A.DocumentDetailDescriptionID,   
    A.HKSID,   
    A.OldInc,   
    A.EffectiveDate,   
    A.DetailedAccount1ID,   
    A.DetailedAccount2ID,   
    A.DetailedAccount3ID,   
    C.FinancialPeriodID,   
    C.SalesCompanyID,   
    B.[Date] 
From acc.DocumentDetail A 
INNER HASH JOIN ACC.Document B ON B.DocumentID = A.DocumentID 
INNER LOOP JOIN ORG.SalesCompanyFinancialPeriod C ON C.SalesCompanyFinancialPeriodID = B.SalesCompanyFinancialPeriodID