#author("2021-01-01T08:24:15+00:00","default:admin","admin") #author("2021-01-01T08:34:36+00:00","default:admin","admin") -[[統計:https://docs.microsoft.com/ja-jp/sql/relational-databases/statistics/statistics?view=sql-server-2017]] -[[Does Updating Statistics Cause a Recompile if No Data Has Changed?:https://www.brentozar.com/archive/2015/01/updating-statistics-cause-recompile-no-data-changed/]] -[[sys.dm_exec_query_stats (Transact-SQL):https://docs.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-query-stats-transact-sql?view=sql-server-2017]] -[[sp_autostats (TRANSACT-SQL):https://docs.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-autostats-transact-sql?view=sql-server-2017]] -[[【統計情報】_WA_SYS_XXXについて:https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20339&forum=26]] -[[統計情報の自動更新に関する考察:https://blog.engineer-memo.com/2012/04/28/%E7%B5%B1%E8%A8%88%E6%83%85%E5%A0%B1%E3%81%AE%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%80%83%E5%AF%9F/]] -[[統計情報のサンプリングの実行プラン:https://blog.engineer-memo.com/2014/11/15/%E7%B5%B1%E8%A8%88%E6%83%85%E5%A0%B1%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%83%97%E3%83%A9%E3%83%B3/]] -[[統計情報の自動更新・手動更新の使い分け:https://techinfoofmicrosofttech.osscons.jp/index.php?SQL%20Server%20%E3%81%AE%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6#b4304d99]] -[[SQL Server 統計情報の自動更新:http://tech.kou.asia/?p=1672]] -[[SQL Server 2008(2012)の統計自動更新について:トレースフラグ2371:http://azwoo.hatenablog.com/entry/2013/02/14/125848]] *統計情報がらみのトラブル [#y77773d1] -[[トラブルシューティングから学ぶSQL Server統計情報の更新タイミング:https://techblog.zozo.com/entry/sqlserver-troubleshooting-statistics]] --[[SQL Database で VIEW SERVER STATE が必要なログインを複数作成する:https://blog.engineer-memo.com/2017/04/19/sql-database-%E3%81%A7-view-server-state-%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E8%A4%87%E6%95%B0%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/]] -[[どうする? SQL Server のクエリ パフォーマンスが低下した!:https://blogs.msdn.microsoft.com/jpsql/2013/09/03/sql-server-5/]] -[[「あるタイミングから」処理が遅くなり、再起動しても再現されてしまう(パフォーマンストラブル):https://www.atmarkit.co.jp/ait/articles/1706/12/news002.html]] **統計情報を更新しても改善されない場合は、一度再起動してみる [#j2a38907] -[[SQL Serverサービス再起動に伴う処理について:https://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/14a49041-853f-4f3d-ab25-f52ca8396ccc/sql-server?forum=sqlserverja]] -SQL Serverが狂った統計情報を使い続けている可能性あり -SQL Serverを再起動することで、更新された統計情報が使用されるようになって、大体改善される **再起動しなくても、キャッシュをクリアすれば良い [#kba8394b] ***[[DBCC FREEPROCCACHE (Transact-SQL):https://docs.microsoft.com/ja-jp/sql/t-sql/database-console-commands/dbcc-freeproccache-transact-sql?view=sql-server-ver15]] [#gdb5548b] DBCC FREEPROCCACHE ***[[DBCC FREESYSTEMCACHE (Transact-SQL):https://docs.microsoft.com/ja-jp/sql/t-sql/database-console-commands/dbcc-freesystemcache-transact-sql?view=sql-server-ver15]] [#w34bd65f] -DBCC FREESYSTEMCACHE を実行すると、SQL Server のインスタンスのプラン キャッシュが消去される -プラン キャッシュが消去されると、後続のすべての実行プランが再コンパイルされ、場合によっては、クエリ パフォーマンスが一時的に急激に低下する -プラン キャッシュ内のキャッシュストアがクリアされるたびに、"SQL Server は、'DBCC FREEPROCCACHE' 操作または 'DBCC FREESYSTEMCACHE' 操作により、'%s' キャッシュストア (プラン キャッシュの一部) のキャッシュストア フラッシュを %d 個検出しました。" という情報メッセージが SQL Server エラー ログに記録される -このメッセージは、5 分以内にキャッシュがフラッシュされる限り、5 分間隔でログに記録される DBCC FREESYSTEMCACHE('ALL') *統計情報の設定 [#ndf0a833] -[[SQL Server の統計情報作成について書いてみた、ちょっとだけマジメにまとめてみた:http://ryuchan.hatenablog.com/entry/2014/03/23/184242]] **小規模向け [#t2c8062f] -統計情報の自動更新 :True -統計情報の非同期更新:True **大規模向け [#hdd76fef] -統計情報の自動更新 :False -統計情報を手動で作成 -統計情報を手動で更新 *統計情報の自動更新 [#z5e39e94] -[[統計の更新:https://docs.microsoft.com/ja-jp/sql/relational-databases/statistics/update-statistics?view=sql-server-2016]] -[[SQL Server 統計情報の自動更新:http://tech.kou.asia/?p=1672]] -[[SQL Server 2008(2012)の統計自動更新について:トレースフラグ2371:http://azwoo.hatenablog.com/entry/2013/02/14/125848]] -[[統計情報のサンプリングについて:https://blog.engineer-memo.com/2012/10/21/%E7%B5%B1%E8%A8%88%E6%83%85%E5%A0%B1%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/]] **自動更新の条件 [#t2247d57] -テーブル行数が0から非0に推移した -前回統計情報が更新された際のテーブル行数が500以下で、統計情報収集対象列が501回以上更新された場合 -前回統計情報が更新された際のテーブル行数が501以上で、統計情報収集対象列が500+(テーブル行数の20%)回以上変更された -一時テーブルの場合は、上述の基準に加え、テーブル行数が6行を超えた *統計情報の非同期更新 [#e546fc24] -[[SQL Server 統計の非同期的自動更新:http://d.hatena.ne.jp/fyts/20081112/async]] -非同期自動更新のメリット --オンライン系のシステム (OLTP) と相性がいい --統計を同期的に更新しないため、タイムアウトが発生する確率が減る -非同期自動更新のデメリット --データウェアハウスなど大規模データをバッチで回すような場合に性能が劣化する --シングルユーザモードの利用が出来なくなる *統計情報自動更新OFFでのシステム運用 [#s74c9a6d] -統計情報の自動更新がONの状態で、オンライン中に統計情報の更新が発生すると、性能的に問題が出ることがある。 -しかし、統計情報の自動更新をOFFにした場合、結局、統計情報が実データと乖離した際に問題が発生する。 -従って、統計情報更新のOFF運用は以下のようになると考える。 --サーバ・メンテナンス時間帯に統計情報の更新をONにして統計情報を更新する。 --STATS_DATE関数で、統計の最終更新日を確認できる。 --サーバ・メンテナンス時間帯に問題(乖離)を発見して手動更新する(難しい)。 --[[参考:【SQL Server】統計情報のヒストグラムと実行プランの予測行数 - 小物SEのメモ帳:http://memorandom-nishi.hatenablog.jp/entry/2017/02/18/021834]] --注意:OFFだと、新たなインデックス追加時などにも統計情報が作成されなくなる。 --Missing Column Index イベントをトレースして統計情報のないIndexが通知を受け取ることができる。 *統計情報に関するSQL [#nef7ad0f] -[[STATS_DATE (Transact-SQL):https://docs.microsoft.com/ja-jp/sql/t-sql/functions/stats-date-transact-sql?view=sql-server-2017]] -[[sys.dm_db_stats_properties (Transact-SQL):https://docs.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-db-stats-properties-transact-sql?view=sql-server-2017]] **統計情報の確認 [#x5e6797a] DBCC SHOW_STATISTICS([テーブル名],[統計情報名]) -このコマンドを実行すると、ヘッダー情報、密度情報、ヒストグラムの各項目が出力される -このコマンドを実行すると以下が出力される --ヘッダー情報 ---統計情報名 ---統計情報の最終更新日 ---テーブルの行数 ---統計情報作成時に使用されたサンプル行数 --密度情報 --ヒストグラム ---RANGE_HI_KEY ... ステップの上限キー値 ---RANGE_ROWS ... ステップ範囲内の行数。RANGE_HI_KEYは含まない ---EQ_ROWS ... RANGE_HI_KEYと全く同じ値の行数 ---DISTINCT_RANGE_ROWS ... ステップ範囲内の一意なキー値の数。RANGE_HI_KEYは含まない ---AVG_RANGE_ROWS ... ステップ範囲内の一意な値ごとの平均行数 **最終更新日時・更新回数の確認 [#g6e9c80f] SELECT OBJECT_NAME(dsp.object_id) , dsp.object_id , ss.name , ss.auto_created , ss.user_created , ss.no_recompute , dsp.last_updated , dsp.rows , dsp.rows_sampled , dsp.steps , dsp.unfiltered_rows , dsp.modification_counter FROM sys.stats AS ss CROSS APPLY sys.dm_db_stats_properties(ss.object_id, ss.stats_id) AS dsp WHERE OBJECT_SCHEMA_NAME(dsp.object_id, DB_ID()) <> 'sys' ORDER BY dsp.last_updated desc **統計情報更新 [#kfa63047] EXEC sp_updatestats;