SQLskills SQL101: Why does my heap have a bunch of empty pages?

SQLskills SQL101: Why does my heap have a bunch of empty pages? - Paul S. Randal

概要

  • SQL Serverのヒープから、全行deleteされたページが開放されずに残っているのはなぜか? インデックスなら全行削除されたページは開放されるのに。
  • その理由は、ヒープから空のページを開放するには、テーブル全体の排他ロックが必要だから。
  • ロックエスカレーションが発動するとか、TABLOCKヒントを使うとか、そういうことをしない限り、テーブル全体が排他ロックされることはないので、大量delete後にヒープには空のページが残ってしまうのだ。
    • もっというと、SNAPSHOP ISOLATIONの下では、TABLOCKヒントを使っても空ページは開放されない。
  • データベースのshrinkをすれば空ページは回収できるが、インデックスの断片化を起こすのと、重い処理なのとで、shrinkはお勧めできない。

語彙

  • caveat: 警告。