さまざまな種類のインデックス、それぞれの利点は何ですか?
-
02-07-2019 - |
質問
さまざまな種類のインデックス、それぞれの利点は何ですか?
カバーインデックスとクラスター化インデックスのことを聞きましたが、他にもありますか?どこで使用しますか?
解決
- 一意-インデックスに含まれる列(または列のセット)の一意の値を保証します
- Covering-特定のクエリ(またはクエリのセット)で使用されるすべての列を含むため、データベースはインデックスのみを使用でき、実際にテーブルデータを見て結果を取得する必要はありません
- クラスター化-これは、実際のデータがディスク上で順序付けられる方法です。つまり、クエリがクラスター化インデックスを使用して値を検索する場合、実際のテーブル行を検索する追加の手順を実行する必要はありません。インデックスに含まれていないデータの場合。
他のヒント
OdeToCodeには、基本的な違いを網羅した優れた記事があります
記事に記載されているとおり:
適切なインデックスは良いために重要です 大規模データベースでのパフォーマンス。 時々あなたは貧しい人々を補うことができます 良好なインデックスを使用したクエリの記述 貧しい人を補うのは難しいかもしれません 最高のクエリでもインデックスを作成できます。
非常に真実です...始めたばかりの場合は、クラスター化インデックスと複合インデックスに焦点を当てます。おそらく最もよく使用されるものだからです。
いくつかのインデックスタイプを追加します
BITMAP-可能な値の数が非常に少ない場合、非常に高速でスペースをあまり消費しません
PARTITIONED-通常、ストレージまたはパフォーマンス上の理由で非常に大きなデータベースオブジェクトに有利ないくつかのプロパティに基づいてインデックスをパーティション分割できます。
FUNCTION / EXPRESSIONインデックス-テーブルに基づいて値を事前計算し、インデックスに格納するために使用されます。非常に単純な例は、lower()またはサブストリング関数に基づくインデックスです。
PostgreSQLでは、述部に一致する行のみがインデックス付けされる部分インデックスが許可されます。たとえば、アクティブなレコードのみの顧客テーブルのインデックスを作成できます。これは次のようになります。
create index i on customers (id, name, whatever) where is_active is true;
インデックスに多くの列があり、非アクティブな顧客が多い場合、これはスペース(インデックスがより少ないディスクページに保存される)とパフォーマンスの点で大きなメリットがあります。インデックスにアクセスするには、少なくとも、述語を指定する必要があります:
select name from customers where is_active is true;
従来の知識では、インデックスの選択はカーディナリティに基づいている必要があります。彼らは言うでしょう、
GENDERなどのカーディナリティの低い列には、ビットマップを使用します。 LAST_NAMEのようなカーディナリティが高いには、bツリーを使用します。
これはOracleの場合ではありません。代わりに、インデックスの選択はアプリケーションのタイプ(OLTPとOLAP)に基づく必要があります。ビットマップインデックスを持つテーブルのDMLは、深刻なロック競合を引き起こす可能性があります。一方、Oracle CBOは複数のビットマップインデックスを簡単に組み合わせることができ、ビットマップインデックスを使用してNULLを検索できます。原則として:
頻繁なDMLおよびルーチンクエリを使用する OLTP システムの場合は、btreeを使用します。まれなDMLおよびアドホッククエリを使用する OLAP システムの場合は、ビットマップを使用します。
これが他のデータベースに当てはまるかどうかはわかりませんが、コメントを歓迎します。次の記事でこの問題についてさらに説明します。
異なるデータベースシステムでは、同じタイプのインデックスに対して異なる名前が付けられているため、注意が必要です。たとえば、SQL ServerとSybaseが「クラスター化インデックス」と呼ぶものOracleで" index-organized table"と呼ばれます。
ジェイソンマッシー( http://statisticsio.com/ )とブレントオザーのブログを検索することをお勧めします。 ( http://www.brentozar.com/ )関連情報。インデックスを扱う実際のシナリオについての投稿があります。
Oracleには、bツリー、ビットマップ、パーティション化および非パーティション化、逆バイト、ビットマップ結合、およびドメインインデックスのさまざまな組み合わせがあります。
このテーマに関する11gR1ドキュメントへのリンクは次のとおりです。 http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004
- ユニーク
- クラスター
- 非クラスター
- 列ストア
- 含まれる列を持つインデックス
- 計算列のインデックス
- フィルタリング
- 空間
- xml
- 全文
SQL Server 2008には、フィルタリングされたインデックス、PostgreSQLの部分インデックスに似ています。両方とも、指定した条件に一致する行のみをインデックスに含めることができます。
構文はPostgreSQLと同じです:
create index i on Customers(name) where is_alive = cast(1 as bit);
インデックスのタイプとその訪問の意味を表示するには: https://msdn.microsoft.com/en-us/library/ms175049.aspx