0

私はこれについての初心者ですので、あなたが助けてくれることを願っています。私は SQL サーバー 2008R2 で作業しており、すべて結合された 4 つのテーブルから構成されるビューがあります。

SELECT DISTINCT ad.award_id,
                bl.funding_id,
                bl.budget_line,
                dd4.monthnumberofyear AS month,
                dd4.yearcalendar      AS year,
                CASE
                  WHEN frb.full_value IS NULL THEN '0'
                  ELSE frb.full_value
                END                   AS Expenditure_value,
                bl.budget_id,
                frb.accode,
                'Actual'              AS Type
FROM   dw.dbo.dimdate5 AS dd4
       LEFT OUTER JOIN dbo.award_data AS ad
                    ON dd4.fulldate BETWEEN ad.usethisstartdate AND
                                            ad.usethisenddate
       LEFT OUTER JOIN dbo.budget_line AS bl
                    ON bl.award_id = ad.award_id
       LEFT OUTER JOIN dw.dbo.fctresearchbalances AS frb
                    ON frb.el3 = bl.award_id
                       AND frb.element4groupidnew = bl.budget_line
                       AND dd4.yearfiscal = frb.yr
                       AND dd4.monthnumberfiscal = frb.period  

ビューには 9 列と 150 万行があり、増え続けています。このビューから * を選択すると、すべての行で 20 分かかりました。結合されているテーブルのフィールドにインデックスを追加し、10 分に改善しました。私の質問は、選択をより速く実行するために他に何ができるでしょうか?

どうもありがとう、ヴァイオレット。

4

4 に答える 4

0

CASE ステートメントは次のように置き換えることができます。

COALESCE(frb.full_value,'0') AS Expenditure_value

詳細な情報がなければ、何が間違っているのかを正確に判断することはできませんが、いくつかの指針を提供するだけです. 非常に多くの LEFT JOINS がある場合、結合の順序によって違いが生じることがあります。列が含まれている標準インデックスまたはカバリング インデックスはありますか? カバーするインデックスがない場合は、結合で主キーが重要になります。結合条件にすべての主キー列を含めると、クエリが高速化されます。

次に、データを見てください。これらのテーブル間の外部キーに基づいて、すべての LEFT JOINS ベースが必要ですか? キーによっては、LEFT JOIN が INNER JOIN と同等になる場合があります。そして、これらすべての LEFT JOINS で、DISTINCT は本当に便利ですか?

どのくらいのRAMを持っていますか? 8GB 以上ある場合、SQL Server では 150 万行では意味がありません。これらの結合を最適化する必要があります。

于 2013-09-27T12:57:21.843 に答える
0

case ステートメントを削除してみてください。

150 万行あり、セット全体ではなくそれらの行の集計に関心がある場合は、最初に fctResearchBalances の行を合計してから結合を実行することをお勧めします。

(アクセス プランを確認せずに、他に何を利用できるかを判断するのは少し困難です。)

于 2013-09-27T10:05:47.663 に答える