都内で働くSEの技術的なひとりごと

都内でサラリーマンやってます。マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。よろしくお願いします♪

SQL Server の統計情報更新と MSSQLSERVER_833 について書いてみた

今日、関東地方は雪景色。

f:id:koogucc11:20140208144018j:plain

f:id:koogucc11:20140208143922j:plain

※DSC-QX10 で撮影しました。

大雪警報も発令されてますね。雪はまだまだやみそうにありません。お出かけの予定もすべてキャンセルになったので、ゆっくり記事を書こうかと思います。

 -----

 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を低下させることが可能です。大事なことなので、覚えておきましょう。