毎日のデータウェアハウスビルドで、比較的長時間(20分以上)統計の自動更新操作が実行されていることに気付きました。関係するテーブルは
CREATE TABLE [dbo].[factWebAnalytics](
[WebAnalyticsId] [bigint] IDENTITY(1,1) NOT NULL,
[MarketKey] [int] NOT NULL CONSTRAINT [DF_factWebAnalytics_MarketKey] DEFAULT ((-1)),
/*Other columns removed*/
CONSTRAINT [PK_factWebAnalytics] PRIMARY KEY CLUSTERED
(
[MarketKey] ASC,
[WebAnalyticsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MarketKeyPS]([MarketKey])
) ON [MarketKeyPS]([MarketKey])
これはMicrosoft SQL Server 2012(SP1)-11.0.3513.0(X64)で実行されているため、書き込み可能な列ストアインデックスは使用できません。
この表には、2つの異なる市場キーのデータが含まれています。ビルドは、特定のMarketKeyのパーティションをステージングテーブルに切り替え、列ストアインデックスを無効にし、必要な書き込みを実行し、列ストアを再構築してから、元に戻します。
統計更新の実行計画は、テーブルからすべての行を引き出し、それらをソートし、推定行数をひどく間違って取得しtempdb
、流出レベル2で流出することを示しています。
ランニング
SELECT [s].[name] AS "Statistic",
[sp].*
FROM [sys].[stats] AS [s]
OUTER APPLY sys.dm_db_stats_properties ([s].[object_id], [s].[stats_id]) AS [sp]
WHERE [s].[object_id] = OBJECT_ID(N'[dbo].[factWebAnalytics]');
ショー
私が明示的にそのインデックスの統計のサンプルサイズを他の人によって使用されるものに縮小しようとすると
UPDATE STATISTICS [dbo].[factWebAnalytics] [PK_factWebAnalytics] WITH SAMPLE 897667 ROWS
クエリは再び20分以上実行され、実行計画では、要求された897,667サンプルではないすべての行が処理されていることが示されます。
このすべての最後に生成される統計はあまり面白くなく、完全なスキャンに費やされる時間を保証するものではありません。
Statistics for INDEX 'PK_factWebAnalytics'.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Name Updated Rows Rows Sampled Steps Density Average Key Length String Index
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PK_factWebAnalytics Jan 22 2016 11:31AM 420072086 420072086 2 0 12 NO 420072086
All Density Average Length Columns
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.5 4 MarketKey
2.380544E-09 12 MarketKey, WebAnalyticsId
Histogram Steps
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 0 3.441652E+08 0 1
2 0 7.590685E+07 0 1
なぜこの動作に遭遇しNORECOMPUTE
ているのか、これらを使用する以外にどのような手順をとることができますか?
再現スクリプトはこちらです。クラスター化されたPKと列ストアインデックスを持つテーブルを作成し、低いサンプルサイズでPK統計を更新しようとします。これはパーティショニングを使用しません-パーティショニングの側面が不要であることを示します。ただし、上記のパーティション分割を使用すると、パーティションを切り替えてから元に戻すと(他の変更がなくても)、modification_counterがパーティション内の行数の2倍に増えるため、統計が実際に保証されるため、問題が悪化します古いと見なされ、自動更新されます。
KB2986627に示されているように、テーブルに非クラスター化インデックスを追加しようとしました(行なしでフィルター処理され、その後失敗した場合、フィルター処理されていないNCIも効果なし)。
再現では、ビルド11.0.6020.0で問題のある動作が示されず、SP3にアップグレードした後、この問題は修正されました。
SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId
私にとっては30秒未満で実行されます。ただし、列ストアインデックスは使用しません。クラスタ化インデックスを使用します。