パーティショニングをしているときにパーティションキーを WHERE に含めている場合の検索効率の違いについてまとめてみたいと思います。
■パーティションキーの有無による検索効率の違い
以下のようなテーブルを作成しています。
CREATE TABLE [dbo].[PersonalInfo]( |
ID がキー項目 (クラスター化インデックス) で、Hash をパーティションで分割するキーとして設定をしています。
このテーブルに対して 2 種類のクエリを実行してみます。
SELECT * FROM PersonalInfo WHERE ID = 32218 |
ひとつはクラスター化インデックスのみを、もう一つはクラスター化インデックスとパーティションキーを含めています。
クラスター化インデックスを条件に指定していますのでどちらもピンポイントでデータを取得できます。
これらのクエリですがパーティションキーの指定有無で読み取るページ数が変わってきます。
最初のクエリでは以下のページ数が読み取られています。
パーティションキーを含めない場合は 12 ページ読み取りが行われていますが、パーティションキーを含めた場合 3 ページの読み取りとなっています。
この違いですが、検索時にツリー構造で検索するかパーティションから検索するかの違いになります。
パーティションキーを含めていない場合、どのパーティションからデータを取得すればよいかの判断ができないため、B-Tree のルートから検索をする必要があります。
そのため、アクセスされたパーティションには複数のパーティションが含まれています。
パーティションキーを含めた場合、特定のパーティションのみを検索すればよいという判断ができます。
この場合は、ルートからデータを検索しなくても特定のパーティションからツリーを検索すればよいことになります。
パーティションキーの有無により対象のデータにたどり着くまでにアクセスする必要のある中間ページの数が変わってくるので、読み取り数に差が出てきます。
検索にパーティションキーを含められる場合は含めておくと多少レスポンスに差が出てくるかと。