SQL Serverがこれらの統計のフルスキャン以外の更新を拒否するのはなぜですか?


13

毎日のデータウェアハウスビルドで、比較的長時間(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にアップグレードした後、この問題は修正されました。

回答:


10

最初に試すのは、SQL Serverインスタンスを、現在お持ちのQFEを備えたSP1 CU16からSP3 CU1(現在の2012ビルド)に更新し、動作が同じかどうかを確認するために再テストすることです。

例えば:

修正:UPDATE STATISTICSは、SQL Serverの列ストアインデックスを持つテーブルに対して誤ったサンプリングと処理を実行します

... SP2で最初にリリースされたCU2が関連する場合があります。

とはいえ、2012年のcolumnstoreがサンプリングされた統計に必要なtablesampleをサポートしているかどうかはわかりません。質問で再現が利用可能になったら、この回答を更新します。


1
(最後の段落に関して)SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId私にとっては30秒未満で実行されます。ただし、列ストアインデックスは使用しません。クラスタ化インデックスを使用します。
マーティンスミス

2
はい、それは間違いなく後のバージョンで修正されたもののように見えます。私はシンプルがここREPRO生産pastebin.com/7f4TwmKWをして11.0.5343.0を実行しているテストサーバー上で10,000行のサンプルサイズのための私の要求を無視して、すべての8,000,000行がサンプリングされたi.stack.imgur.com/DbbjZ.png(計画を質問のものとほぼ同じ)-しかし、Microsoft SQL Server 2012(SP3)(KB3072779)でこれに遭遇することはありません-11.0.6020.0(そこにサンプリングされた行は274,649で、推定行数にかなり近いです)以前のビルドと計画では、列ストアではなくCIを使用しています。)
マーティンスミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.