web-dev-qa-db-ja.com

自動更新統計が統計を更新しない

_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_より明らかに大きいテーブルに挿入した後でも、自動更新統計が起動しなかったのはなぜですか?ここで何が欠けていますか

8

新しい計算は、トレースフラグ2371が有効になっている場合にのみ使用されます。ただし、SQL Server 2016では、コンテキストデータベースの互換性レベルがデフォルトの動作である130に設定されています。 Microsoft KB 2754171を参照してください。

SQL ServerでのAutostat(AUTO_UPDATE_STATISTICS)動作の制御

データが変更されても統計は更新されません。 コストベースの最適化により、クエリの対象となる統計が古くなっていることが検出されると、統計の更新がトリガーされます。

オプティマイザーは、単一の明白な計画が常に最適であるような非常に単純な(「些細な」)クエリのコストベースの最適化を入力しません。そのシナリオでは、統計の更新は発生しません。

マイクロソフトホワイトペーパー SQL Server 2012のキャッシュと再コンパイルの計画 をGreg Lowが参照してください。

11
Paul White 9