web-dev-qa-db-ja.com

さまざまな種類のインデックス、それぞれの利点は何ですか?

さまざまな種類のインデックス、それぞれの利点は何ですか?

カバーインデックスとクラスター化インデックスのことを聞きましたが、他にもありますか?どこで使用しますか?

31
Brian G
  • 一意-インデックスに含まれる列(または列のセット)の一意の値を保証します
  • カバー-特定のクエリ(またはクエリのセット)で使用されるすべての列を含み、データベースがインデックスのみを使用し、結果を取得するためにテーブルデータを実際に見る必要がないようにします。
  • クラスター化-これは実際のデータがディスク上で順序付けられる方法です。つまり、クエリがクラスター化インデックスを使用して値を検索する場合、データの実際のテーブル行を検索する追加のステップを実行する必要はありません。インデックスには含まれません。
31
Chris Shaffer

OdeToCodeには基本的な違いをカバーする優れた記事があります

記事で述べているように:

適切なインデックスは、大規模なデータベースで良好なパフォーマンスを得るために重要です。時には、適切なインデックスを使用して作成された質の悪いクエリを補うことができますが、最高のクエリであっても不十分なインデックス作成を補うのは難しい場合があります。

非常に真実です...始めたばかりの場合は、クラスターインデックスと複合インデックスに焦点を当てます。おそらく最もよく使用されるインデックスだからです。

7
Kevin Fairchild

インデックスタイプをいくつか追加します

BITMAP-可能な値の数が非常に少なく、非常に高速で、多くのスペースを占有しない場合

PARTITIONED-ストレージまたはパフォーマンス上の理由で非常に大きなデータベースオブジェクトで通常有利ないくつかのプロパティに基づいてインデックスをパーティション化できます。

FUNCTION/EXPRESSIONインデックス-テーブルに基づいて値を事前計算し、インデックスに格納するために使用されます。非常に単純な例は、lower()またはサブストリング関数に基づくインデックスです。

6
mmaibaum

PostgreSQLでは、述部に一致する行のみがインデックス付けされる部分インデックスが許可されます。たとえば、アクティブなレコードのみの顧客テーブルのインデックスを作成できます。これは次のようになります。

create index i on customers (id, name, whatever) where is_active is true;

インデックスに多くの列があり、非アクティブな顧客が多い場合、これはスペース(インデックスがより少ないディスクページに格納される)とパフォーマンスの点で大きなメリットとなります。インデックスにアクセスするには、少なくとも、述語を指定する必要があります。

select name from customers where is_active is true;
5
dland

従来の知識では、インデックスの選択はカーディナリティに基づいている必要があります。彼らは言うでしょう、

GENDERのようなlowカーディナリティ列には、ビットマップを使用します。 LAST_NAMEのような高カーディナリティの場合は、bツリーを使用します。

これは、Oracleの場合ではなく、インデックスの選択は代わりにアプリケーションのタイプ(OLTPとOLAP)に基づいている必要があります。ビットマップインデックスを持つテーブルのDMLは、深刻なロック競合を引き起こす可能性があります。一方、Oracle CBOは複数のビットマップインデックスを簡単に組み合わせることができ、ビットマップインデックスを使用してNULLを検索できます。原則として:

頻繁なDMLおよびルーチンクエリを使用する[〜#〜] oltp [〜#〜]システムの場合は、btreeを使用します。まれなDMLおよびアドホッククエリを使用する[〜#〜] olap [〜#〜]システムの場合は、ビットマップを使用します。

これが他のデータベースに当てはまるかどうかはわかりませんが、コメントを歓迎します。次の記事でこの問題についてさらに説明します。

3
jimmyorr

異なるデータベースシステムでは、同じタイプのインデックスに対して異なる名前が付けられているため、注意が必要です。たとえば、SQL ServerとSybaseが「クラスタ化インデックス」と呼ぶものは、Oracleでは「インデックス構成表」と呼ばれます。

2
skaffman

Oracleには、Bツリー、ビットマップ、パーティション化および非パーティション化、リバースバイト、ビットマップ結合、およびドメインインデックスのさまざまな組み合わせがあります。

この件に関する11gR1ドキュメントへのリンクは次のとおりです。 http://download.Oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

2
David Aldridge

Jason Massie( http://statisticsio.com/ )とBrent Ozar( http://www.brentozar.com/ )のブログで関連するものを検索することをお勧めします情報。彼らは、インデックスを扱う実際のシナリオについての投稿をいくつか持っています。

2
MarlonRibunal
  1. ユニーク
  2. クラスタ
  3. 非クラスター
  4. 列店
  5. 列を含むインデックス
  6. 計算列のインデックス
  7. フィルター済み
  8. 空間的
  9. xml
  10. 全文
1
abu

インデックスのタイプとその意味の訪問を表示するには、次のようにします。 https://msdn.Microsoft.com/en-us/library/ms175049.aspx

0

SQL Server 2008には フィルターインデックス があり、PostgreSQLの 部分インデックス に似ています。どちらも、指定した条件に一致する行のみをインデックスに含めることができます。

構文はPostgreSQLと同じです。

create index i on Customers(name) where is_alive = cast(1 as bit);
0
Constantin