さまざまな種類のインデックス、それぞれの利点は何ですか?
カバーインデックスとクラスター化インデックスのことを聞きましたが、他にもありますか?どこで使用しますか?
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のようなlowカーディナリティ列には、ビットマップを使用します。 LAST_NAMEのような高カーディナリティの場合は、bツリーを使用します。
これは、Oracleの場合ではなく、インデックスの選択は代わりにアプリケーションのタイプ(OLTPとOLAP)に基づいている必要があります。ビットマップインデックスを持つテーブルのDMLは、深刻なロック競合を引き起こす可能性があります。一方、Oracle CBOは複数のビットマップインデックスを簡単に組み合わせることができ、ビットマップインデックスを使用してNULLを検索できます。原則として:
頻繁なDMLおよびルーチンクエリを使用する[〜#〜] oltp [〜#〜]システムの場合は、btreeを使用します。まれなDMLおよびアドホッククエリを使用する[〜#〜] olap [〜#〜]システムの場合は、ビットマップを使用します。
これが他のデータベースに当てはまるかどうかはわかりませんが、コメントを歓迎します。次の記事でこの問題についてさらに説明します。
異なるデータベースシステムでは、同じタイプのインデックスに対して異なる名前が付けられているため、注意が必要です。たとえば、SQL ServerとSybaseが「クラスタ化インデックス」と呼ぶものは、Oracleでは「インデックス構成表」と呼ばれます。
Oracleには、Bツリー、ビットマップ、パーティション化および非パーティション化、リバースバイト、ビットマップ結合、およびドメインインデックスのさまざまな組み合わせがあります。
この件に関する11gR1ドキュメントへのリンクは次のとおりです。 http://download.Oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004
Jason Massie( http://statisticsio.com/ )とBrent Ozar( http://www.brentozar.com/ )のブログで関連するものを検索することをお勧めします情報。彼らは、インデックスを扱う実際のシナリオについての投稿をいくつか持っています。
インデックスのタイプとその意味の訪問を表示するには、次のようにします。 https://msdn.Microsoft.com/en-us/library/ms175049.aspx
SQL Server 2008には フィルターインデックス があり、PostgreSQLの 部分インデックス に似ています。どちらも、指定した条件に一致する行のみをインデックスに含めることができます。
構文はPostgreSQLと同じです。
create index i on Customers(name) where is_alive = cast(1 as bit);