_SQL SERVER 2012
_を使用していますデータベースに_Auto Update Stats
_[〜#〜] on [〜#〜]があります。
以下のリンクから、自動更新の統計がテーブル行のSQRT(1000 * Table rows)
の変更ごとに発生することを学びました。 https://blogs.msdn.Microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/
1000レコードのテーブルを作成しました
_SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
name
INTO stst
FROM sys.objects
_
統計の作成
_CREATE STATISTICS rn
ON stst (rn)
CREATE STATISTICS name
ON stst (name)
_
作成した統計の確認
_DBCC show_statistics('stst', rn) -- Rows 500
DBCC show_statistics('stst', name) -- Rows 500
_
式に従って
_select SQRT(1000 * 500) -- 707.106781186548
_
したがって、テーブルに_707.106781186548
_レコードを追加/変更すると、自動更新統計が起動します
_1000
_を起動するのに十分以上のレコードをテーブルに追加する_auto update stats
_
_INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
a.name
FROM sys.objects a
_
_auto update stats
_を起動するには
_Select * from stst
_
統計の確認
_DBCC show_statistics('stst', rn) -- Rows 500
DBCC show_statistics('stst', name) -- Rows 500
_
残念ながら、まだRows
は_500
_のみです。
SELECT
の実行中に_1000
_レコードを_707.106781186548
_より明らかに大きいテーブルに挿入した後でも、自動更新統計が起動しなかったのはなぜですか?ここで何が欠けていますか
新しい計算は、トレースフラグ2371が有効になっている場合にのみ使用されます。ただし、SQL Server 2016では、コンテキストデータベースの互換性レベルがデフォルトの動作である130に設定されています。 Microsoft KB 2754171を参照してください。
SQL ServerでのAutostat(AUTO_UPDATE_STATISTICS)動作の制御
データが変更されても統計は更新されません。 コストベースの最適化により、クエリの対象となる統計が古くなっていることが検出されると、統計の更新がトリガーされます。
オプティマイザーは、単一の明白な計画が常に最適であるような非常に単純な(「些細な」)クエリのコストベースの最適化を入力しません。そのシナリオでは、統計の更新は発生しません。
マイクロソフトホワイトペーパー SQL Server 2012のキャッシュと再コンパイルの計画 をGreg Lowが参照してください。