SQL Serverサンプルの統計更新では、昇順キー列で最も高いRANGE_HI_KEYが欠落しています


10

統計のサンプリングがどのように機能するか、およびサンプリングされた統計の更新に対して以下の動作が期待されるかどうかを理解しようとしています。

数十億行の日付で分割された大きなテーブルがあります。分割日は前の営業日であり、昇順のキーです。前日のデータのみをこのテーブルにロードします。

データの読み込みは夜間に実行されるため、4月8日金曜日に7日目のデータを読み込みました。

実行するたびに、統計を更新しますが、ではなくサンプルを使用しFULLSCANます。

たぶん私はナイーブですが、SQL Serverが範囲内の最高のキーと最低のキーを識別して、正確な範囲サンプルを確実に取得することを期待していました。この記事によると:

最初のバケットの場合、下限は、ヒストグラムが生成される列の最小値です。

ただし、最後のバケット/最大値については言及していません。

サンプリングされた統計の更新が8日の朝に行われたため、サンプルは表(7日)で最も高い値を逃しました。

ここに画像の説明を入力してください

前日のデータに対して多くのクエリを実行したため、カーディナリティの推定が不正確になり、多くのクエリがタイムアウトしました。

SQL Serverはそのキーの最高値を特定し、それを最大値として使用するべきではありませんRANGE_HI_KEYか?それとも、これを使用しない場合の更新の制限の1つにすぎFULLSCANませんか?

バージョンSQL Server 2012 SP2-CU7。OPENQUERYSQL ServerとOracleの間のリンクサーバークエリの数値を切り捨てていたSP3の動作が変更されたため、現在アップグレードできません。

回答:


11

SQL Serverはそのキーの最高値を特定し、それを最大値として使用するべきではありませんRANGE_HI_KEYか?それとも、これを使用しない場合の更新の制限の1つにすぎFULLSCANませんか?

これは、サンプリングされた統計の現在の実装の制限です。現状では、サンプリングされた統計収集はを使用しますTABLESAMPLE SYSTEM。これは、割り当て順スキャンを使用し、スキャンからサンプリングするページを選択します。選択したページのみがヒストグラムに寄与します。

スキャンは(インデックス順ではなく)割り当て順であるため、キー順で最初と最後のページを優先する方法はありません。

詳細については、次の関連質問を参照してください。

統計を更新するときにサンプリングはどのように機能しますか?

と私の記事、Allocation Order Scans

回避策については、Fabiano Amorimによる昇順列の統計を参照してください。


2

簡単な推測:トレースフラグ4139を有効にします。

すでにSP2-CU1を実行しているため、これは機能するはずです

TF 2389 ad 2390に関するガイドラインにも注意してください。また、http: //sql-sasquatch.blogspot.com.mt/2013/06/mssql-plan-guides-to-address-ascending.htmlも参照してください。

(注意してください、私は実際にはこの問題にぶつからず、それほど深く潜っていません)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.