統計のサンプリングがどのように機能するか、およびサンプリングされた統計の更新に対して以下の動作が期待されるかどうかを理解しようとしています。
数十億行の日付で分割された大きなテーブルがあります。分割日は前の営業日であり、昇順のキーです。前日のデータのみをこのテーブルにロードします。
データの読み込みは夜間に実行されるため、4月8日金曜日に7日目のデータを読み込みました。
実行するたびに、統計を更新しますが、ではなくサンプルを使用しFULLSCAN
ます。
たぶん私はナイーブですが、SQL Serverが範囲内の最高のキーと最低のキーを識別して、正確な範囲サンプルを確実に取得することを期待していました。この記事によると:
最初のバケットの場合、下限は、ヒストグラムが生成される列の最小値です。
ただし、最後のバケット/最大値については言及していません。
サンプリングされた統計の更新が8日の朝に行われたため、サンプルは表(7日)で最も高い値を逃しました。
前日のデータに対して多くのクエリを実行したため、カーディナリティの推定が不正確になり、多くのクエリがタイムアウトしました。
SQL Serverはそのキーの最高値を特定し、それを最大値として使用するべきではありませんRANGE_HI_KEY
か?それとも、これを使用しない場合の更新の制限の1つにすぎFULLSCAN
ませんか?
バージョンSQL Server 2012 SP2-CU7。OPENQUERY
SQL ServerとOracleの間のリンクサーバークエリの数値を切り捨てていたSP3の動作が変更されたため、現在アップグレードできません。