0

私たちの SQL Server 2012 Enterprise セットアップには説明できないパフォーマンスの問題があり、皆さんにアイデアがあれば幸いです。

集計する多数の int 列を含むファクト テーブルと、地域ディメンション テーブルがあります。

これは、ファクト テーブルの構造です。

  • regionId (整数)
  • 収益 (10 進数 10,2)
  • orderIntake (10 進数 10,2)

これがディメンション テーブルの構造です。

  • worldRegion(varchar(100)9
  • クラスター (varchar(100))
  • 国 (varchar(100))
  • regionId (整数)

ファクト テーブルとディメンション テーブルは、regionId 列に対する INNER JOIN を介して接続されます。国を制限しない限り、これのパフォーマンスは非常に優れています。

例えば

SELECT SUM(revenue) FROM factTable f INNER JOIN regionDim r ON f.regionId=r.regionId

高速です (<1 秒)。

でも

SELECT SUM(revenue) FROM factTable f INNER JOIN regionDim r ON f.regionId=r.regionId WHERE r.country IN ('France','Germany')

約 500k レコードではかなり遅い (> 8 秒)。

次のような指標があります。

  • regionId 列のファクト テーブルの ColumnStore インデックス
  • ディメンション テーブルのクラスター化インデックス (regionId、country、cluster、worldRegion)

インデックスまたは全体的な構造の観点から変更できることはありますか?

4

2 に答える 2

2

dim テーブルのインデックスの列の順序では、2 番目のクエリの where 句でこのインデックスを使用できません。これは、行が 1 番目のインデックス列 (regionId) によってインデックス付けされ、次に 2 番目 (country) などによってインデックス付けされるためです。2 列目だけを使用するのは、名だけで誰かを検索するときに電話帳を使用するようなものです。国列に別のインデックスを配置して、パフォーマンスが向上するかどうかを確認してください。

于 2013-09-25T10:07:53.717 に答える