今日、関東地方は雪景色。
大雪警報も発令されてますね。雪はまだまだやみそうにありません。お出かけの予定もすべてキャンセルになったので、ゆっくり記事を書こうかと思います。
-----
SQL Server で統計情報を更新するには、UPDATE STATISTICS 使用します。UPDATE STATISTICS table_name WITH FULLSCAN で実行すると、テーブルの統計情報更新が 1 トランザクションで処理されます。
統計情報を更新に行われるデータの並び替え操作はワークスペース領域で収まらない場合、tempdb で処理されます。非常に容量が大きいテーブルで、統計情報が多く存在するテーブルをこのような更新方法を使用すると、tempdb の I/O が増加し、肥大化の原因になってしまいます。ある環境では、下記のようなログが出力され、tempdb が 50G まで拡張していました。E:\XXX\XXX\XXX.ndf の I/O に15秒以上 時間がかかっているという内容です。
2014-XX-XX XX:XX:XX.XX spid5s SQL Server has encountered 7620 occurrence(s) of I/O requests taking longer than 15 seconds to complete on file [E:\XXX\XXX\XXX.ndf] in database [tempdb] (2). The OS file handle is 0x000000000000075C. The offset of the latest long I/O is: 0x000000990e0000
SQL Server は、I/Oの要求が15 秒以上かかると、メッセージ 833 をイベント ログに記録し、SQL Server のエラーログに上記のようなメッセージを記録します。
今回のような事象では、UPDATE STATISTICS table_name index_name or statistics_name と指定します。これにより、1トランザクションで処理されるデータ量を統計情報単位にまで削減でき、I/Oを低下させることが可能です。大事なことなので、覚えておきましょう。