web-dev-qa-db-ja.com

パーティションテーブルクエリでテーブルスキャンを取得するのはなぜですか?

テーブルInventory_BreakIR_ID(int)にパーティション化されています。また、テーブルにIR_IDの非クラスター化インデックスを作成しました。

私が以下を実行すると:

SELECT  *
FROM    dbo.INVENTORY_BREAK
WHERE   IR_ID IN ( 100, 101, 102 )

次の実行プランを取得します。

enter image description here

テーブルスキャン(HEAP)と記載されています。パーティションテーブルのコンテキストでそれが何を意味するのかよくわかりません。また、どのような種類のインデックスも使用していることはわかりません。それでも、クエリはかなり高速に返されるため、必要です(たとえば、テーブルには600万行があります)。

だから、私の質問は次のとおりです。

  1. パーティションテーブルのテーブルスキャン(HEAP)はどういう意味ですか?
  2. おそらく舞台裏で、実際にインデックスを使用していますか?
  3. 効率を上げるために何かしなければならないことはありますか?
3
AngryHacker

クエリdidパーティションの削除を行います。

ツールチップを見ると、実際のパーティション数は3と表示されています。これは、3つのパーティションにアクセスしたことを意味します。 (Seek Predicateセクションでもこれを確認します。)

テーブルスキャンとして表示される理由は、パーティションが削除されたテーブルスキャンであるためです。他にどう説明したらいいのかわからない。

これにはインデックスは使用されませんでした。テーブルのパーティション分割は、インデックスよりもデータベースの内部構造の奥深くに実装されているため、パーティションの削除は本質的に非常に効率的です(指定した適切な述語が与えられた場合)。

とは言うものの、あなたが与えた述語はパーティションの除去にのみ適しており、(おそらく)あまり選択的ではないので他にはあまり適していません。これらのパーティションのすべての行が必要な場合、これはすでに最適なソリューションに近いです。通常、有用なクラスター化されたインデックスを作成することをお勧めします。

2
Jon Seigel