2009-04-07 3 views
1

それぞれに数百万の行がある4つのテーブルを照会するtransact SQL文があります。数百万の行を持つ4つのテーブル間の結合によるSqlクエリ

TuningAdvisorに基づいてインデックスと統計情報を使用して最適化されていても、数分かかることがあります。各トランザクションテーブルが数百万行を含んでいるので、私は@real@budget、および@hoursのようにテーブル変数を使用して、トランザクションテーブルにつき1つのクエリにそれを分割を検討し

 
SELECT E.EmployeeName 
    , SUM(M.Amount) AS TotalAmount 
    , SUM(B.Amount) AS BudgetAmount 
    , SUM(T.Hours) AS TotalHours 
    , SUM(TB.Hours) AS BudgetHours 
    , SUM(CASE WHEN T.Type = 'Waste' THEN T.Hours ELSE 0 END) AS WastedHours 
FROM Employees E 
LEFT JOIN MoneyTransactions M 
    ON E.EmployeeID = M.EmployeeID 
LEFT JOIN BudgetTransactions B 
    ON E.EmployeeID = B.EmployeeID 
LEFT JOIN TimeTransactions T 
    ON E.EmployeeID = T.EmployeeID 
LEFT JOIN TimeBudgetTransactions TB 
    ON E.EmployeeID = TB.EmployeeID 
GROUP BY E.EmployeeName 

クエリの構造が似ています最後にSELECTに参加してください。しかし、テストではスピードアップしていないようです。

これをスピードアップするにはどうすれば対処できますか?

答えて

8

あなたが投稿したクエリがあなたが期待している結果をもたらすかどうかはわかりません。

すべての次元テーブル(MoneyTransactionsなど)を交差結合し、すべての結果を掛けます。私はあなたが物事をスピードアップしますあなたのテーブルのすべてのインデックスを持っているかどうか知りませんが、大きなテーブルを持つことが、問合せ時間に、この影響を与える可能性が

SELECT E.EmployeeName, 
     (
     SELECT SUM(amount) 
     FROM MoneyTransactions m 
     WHERE M.EmployeeID = E.EmployeeID 
     ) AS TotalAmount, 
     (
     SELECT SUM(amount) 
     FROM BudgetTransactions m 
     WHERE M.EmployeeID = E.EmployeeID 
     ) AS BudgetAmount, 
     (
     SELECT SUM(hours) 
     FROM TimeTransactions m 
     WHERE M.EmployeeID = E.EmployeeID 
     ) AS TotalHours, 
     (
     SELECT SUM(hours) 
     FROM TimeBudgetTransactions m 
     WHERE M.EmployeeID = E.EmployeeID 
     ) AS BudgetHours 
FROM Employees E 
+0

Hmmm ...そうではありませんSELECT EmployeeID、EmployeeName、SUM(...)、SUM(...)従業員からGROUP BY EmployeeID、EmployeeName? – Tomalak

+0

プライマリキーでグループ化する理由 – Quassnoi

+0

それは間違いです(読みづらい)。決して気にしないでください。 +1 – Tomalak

1

はこれを試してみてください。 可能であれば、テーブルを分割することをお勧めします。それはより多くの作業ですが、クエリーを高速化するために行うすべての作業は、数百万の新しいレコードの後では十分ではありません。

関連する問題