システムビュー_sys.partitions
_には、特定のパーティションの行の総数である列「行」があります。パーティション化されていない(または、見方によっては1つのパーティションしか持たない)テーブルの場合、この列はテーブルの行数を示します。
この列がどれほど正確で、SELECT COUNT(1) FROM TableName
の代わりに使用できるか知りたいです。テーブルを作成して数千行を追加し、数百行を削除し、さらに数千行追加するなど、いくつかの実験を行いましたが、カウントは常に実行されていません。ただし、約700ミルの行といくつかのインデックスを持つ1つのテーブルがあります。クラスター化インデックスの_sys.partitions
_の行は再び無効になりますが、他のインデックスには若干の変動(+ -20k)が示されます。
この行がどのように計算され、それが表示されるほど正確であるかどうか誰かが知っていますか?
Books Onlineは、行フィールドは「このパーティションの行数近似を示している」と述べています。したがって、100%正確であるとは限りませんが、100%正確であると期待します。
Michael Zilbersteinは、sys.partitions
の例が For want of a nail で大幅に正しくないことを報告しています。よくあることではありませんが、可能です。
sys.dm_db_index_physical_stats
には、より正確に見えるrecord_count
フィールドが含まれていますが、AlwaysOn読み取り可能なセカンダリレプリカをホストしているインスタンスでDMVを実行すると、REDOブロッキングの問題が発生する可能性があることに注意してください。
record_count
フィールドの explanation は、次の情報を示します。
レコードの総数。
インデックスの場合、レコードの総数は、IN_ROW_DATAアロケーションユニットのBツリーの現在のレベルに適用されます。
ヒープの場合、IN_ROW_DATAアロケーションユニット内のレコードの総数。
ヒープの場合、この関数から返されるレコードの数は、ヒープに対してSELECT COUNT(*)を実行して返される行の数と一致しない場合があります。これは、行に複数のレコードが含まれる可能性があるためです。たとえば、一部の更新状況では、更新操作の結果として、単一のヒープ行に転送レコードと転送レコードが含まれる場合があります。また、ほとんどの大きなLOB行は、LOB_DATAストレージで複数のレコードに分割されます。 LOB_DATAまたはROW_OVERFLOW_DATAアロケーションユニットの場合、アロケーションユニット全体のレコードの総数。
スタックオーバーフローに関する同様の質問の Martin Smithの回答 も参照してください。
実際、BOLはこの列について、「このパーティションのおよその行数を示している」と述べています。そして、近似は非常に近似です。私はすでに、特定のパーティションに1つのレコードがあることを確認しました。 sy.partitions.rowsは4048行を示していました。このレコードを削除した後も、すべてのインデックスを再構築した後などでも、4048行を示していました。そのため、1つの結論として、信頼しない場合はそうしないでください。