私は大きなテーブルのさまざまなアーキテクチャをテストしていますが、私が見た提案の1つは、大きなテーブルを一連の小さな「パーティション」テーブルに分割するパーティションビューを使用することです。
このアプローチをテストする中で、あまり意味をなさない何かを発見しました。ファクトビューの「パーティション列」でフィルタリングすると、オプティマイザーは関連するテーブルのみを検索します。さらに、ディメンションテーブルのその列でフィルタリングすると、オプティマイザーは不要なテーブルを削除します。
ただし、ディメンションの他の側面でフィルタリングすると、オプティマイザーは各ベーステーブルのPK / CIを検索します。
問題のクエリは次のとおりです。
select
od.[Year],
AvgValue = avg(ObservationValue)
from dbo.v_Observation o
join dbo.ObservationDates od
on o.ObservationDateKey = od.DateKey
where o.ObservationDateKey >= 20000101
and o.ObservationDateKey <= 20051231
group by od.[Year];
select
od.[Year],
AvgValue = avg(ObservationValue)
from dbo.v_Observation o
join dbo.ObservationDates od
on o.ObservationDateKey = od.DateKey
where od.DateKey >= 20000101
and od.DateKey <= 20051231
group by od.[Year];
select
od.[Year],
AvgValue = avg(ObservationValue)
from dbo.v_Observation o
join dbo.ObservationDates od
on o.ObservationDateKey = od.DateKey
where od.[Year] >= 2000 and od.[Year] < 2006
group by od.[Year];
SQL Sentry Plan Explorerセッションへのリンクは次のとおりです。
私は実際に大きなテーブルをパーティション分割して、同様の方法で応答するパーティションを削除できるかどうかを確認しています。
ディメンションの側面でフィルター処理する(単純な)クエリのパーティション削除を取得します。
それまでの間、データベースの統計のみのコピーを次に示します。
https://gist.github.com/swasheck/9a22bf8a580995d3b2aa
「古い」カーディナリティ推定器は、より安価なプランを取得しますが、それは各(不要な)インデックスシークのカーディナリティ推定値が低いためです。
ディメンションの別の側面でフィルター処理するときにオプティマイザーがキー列を使用して、無関係なテーブルでのシークを排除できるようにする方法があるかどうかを知りたい。
SQL Serverバージョン:
Microsoft SQL Server 2014 - 12.0.2000.8 (X64)
Feb 20 2014 20:04:26
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
ObservationDates
テーブルの統計情報がありません。4199であっても、ポールと同じ計画を立てていません。これが理由だと思います。
ObservationDates
。UPDATE STATISTICS ObservationDates WITH ROWCOUNT = 10000
しかし、ポールが示した計画を得るために、私は手動で実行することになりました。
ObservationDates
ので、何が起こっているのかわかりません。また、私は計画ポールを生成することもできません。更新を試してみます。
CREATE STATISTICS [_WA_Sys_00000008_2FCF1A8A] ON [dbo].[Observation_2010]([StationStateCode]) WITH STATS_STREAM = 0x01000000010000000000000000000000D4531EDB00000000D5080000000000009508000000000000AF030000AF000000020000000000000008D000340000000007000000E65DE0007DA5000076F9780000000000867704000000000000000000ABAAAA3C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000