これら2つのクエリのいずれかを使用して、論理読み取りの合計と物理読み取りの合計を確認できます。
SELECT DB_NAME(st.dbid) Db,
OBJECT_NAME(st.objectid, st.dbid) Prc,
qs.execution_count,
qs.total_logical_reads,
qs.total_physical_reads,
qs.statement_start_offset,
qs.statement_end_offset,
st.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;
SELECT DB_NAME(database_id) Db,
OBJECT_NAME(object_id, database_id) Prc,
execution_count,
total_logical_reads,
total_physical_reads
FROM sys.dm_exec_procedure_stats ps;
最初のステートメントはこれをステートメントごとに分類し、2番目のステートメントは手順全体でカウントします。
物理読み取りはディスクに対する読み取りであり、論理読み取りはメモリに対する読み取りです。これを使用して、システムで最も高価なプロシージャまたはステートメントを特定し、それらを調整してみてください。
論理的な読み取りは物理的な読み取りよりもはるかに安価ですが、依然として高価なので、それらの数を減らす(たとえば、適切なインデックスを追加する)と、クエリの実行速度が大幅に向上します。
上記のDMVには、興味深いと思われる追加の列がたくさんあります。
インデックスは論理読み取りを減らすのにどのように役立ちますか?
SQL Serverでは、すべてのデータはサイズが8 KBのブロックに編成されます。これらのブロックは「ページ」と呼ばれます。
すべてのテーブルには、テーブルの構造とpataページに関する情報を含む「メタ」ページが含まれています。インデックスが存在せず、SELECT * FROM tbl WHERE Id = 7
SQL Server などのクエリを実行する場合、テーブル全体でこの行またはこれらの行を検索する必要があります。そのため、一度に1ページずつ読み取り、各ページのすべての行をループして、WHERE
句に適合する行を決定します。したがって、テーブルに1,000,000ページを保存する必要がある場合、このクエリの実行には1,000,000の論理読み取りが必要になります。
インデックスがある場合、SQL Serverはページ内でデータを論理的に並べ替え、ページ間のリンクリストを確立します。これによりORDER BY
、高価なソート操作なしでクエリを実行できます。しかし、重要なことは、並べ替え、SQL ServerがテーブルにBツリーを追加することです。B + Treeは、本のインデックスに匹敵する構造です。特定のキーワードを探すと、そのキーワードを含むページに直接ジャンプできます。典型的な本には1つのインデックスレベルしかありませんが、B +ツリーには複数のインデックスレベルを設定できます。インデックス自体が複数ページの長さである大きな本を考えてください。そのような場合、ページでインデックスワードが始まることを示す追加のインデックスレイヤーを追加することは理にかなっていますS
。
B + Treeは、インデックスレベルごとに1ページを読み取ることでインデックス内のレコードを検索できるというプロパティを提供しながら、できるだけ少ないレベルを持つように最適化されます。したがって、でWHERE Id = 7
ソートされたインデックスがある場合、上記のクエリを想定してくださいId
。インデックスには5つのレベルがあるとしましょう。ここで、このクエリに一致するすべてのレコードを検索するには、インデックスレベルごとに1ページ(つまり5ページ)を読み取る必要があります。これは「インデックスシーク」と呼ばれます。法案に適合する複数のレコードがある場合、それらのすべてを取得するために、しばらくの間、ソートされたインデックスに従う必要があります。しかし、レコードが1つしかないと仮定しましょう。
したがって、インデックスを実行せずにクエリを実行すると1,000,000回の読み取りが必要でしたが、実際には5回の読み取りが必要でした。論理読み取りはインメモリ操作ですが、かなりのコストがかかります。実際、上記のような単純なクエリで最も高価な操作です。したがって、必要な論理読み取りの量を200,000分の1に減らすと、同様の要因でクエリが高速化されます。
したがって、論理読み取りはテーブルスキャンと同等ではありませんが、テーブルスキャンはインデックスシークよりもはるかに多くの論理読み取りを引き起こします。