1

それぞれ数百万行の 4 つのテーブルをクエリするトランザクション SQL ステートメントがあります。

TuningAdvisor に従ってインデックスと統計を使用して最適化されていますが、数分かかります。

クエリの構造は次のようになります。

SELECT E.従業員名
    , 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 従業員 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

@real各トランザクション テーブルには数百万行が含まれているため、@budget、 、 などのテーブル変数を使用してトランザクション テーブルごとに 1 つのクエリに分割し、@hoursこれらを final に結合することを検討しますSELECT。しかし、テストでは、速度が向上しないようです。

それをスピードアップするためにどのように対処しますか?

4

3 に答える 3

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
于 2009-04-07T10:04:50.243 に答える
1

物事を高速化するすべてのインデックスがテーブルにあるかどうかはわかりませんが、大きなテーブルがあると、クエリ時間にこのような影響が及ぶ可能性があります。可能であれば、テーブルを分割することをお勧めします。それはより多くの作業ですが、数百万の新しいレコードの後では、クエリを高速化するために行うすべてのことは十分ではありません.

于 2009-04-07T10:17:27.687 に答える