Oracleの原則:インデックス

    テーブルにインデックスを作成します。インデックスは本のディレクトリと同じようにテーブル用です。インデックスを使用すると、テーブル内のデータ位置を直接見つけることができるため、検索速度が大幅に向上します。インデックスはディスクIOを削減でき、テーブルデータから論理的および物理的に独立しています。インデックスは任意のディスクに保存できます。さらに、Oracleは自動的にインデックスを維持します。

 1.一意のインデックス、複合インデックス、逆キーインデックス、関数インデックス、ビットマップインデックス

    インデックスは、Bツリー(Bツリー)インデックスとビットマップ(ビットマップ)インデックスに分けることができます。Bツリーインデックスは、一意のインデックス、複合インデックス、逆キーインデックス、および関数ベースのインデックスにさらに分類されます。データ構造を学んだ人はBツリーを知っており、すべてのリーフノードは同じ深さにあります。各ノードブロックにはキーワードを含めることができます。たとえば、ノードブロックに100、200 500のキーワードが含まれている場合、4つのリーフノードがあり、データ範囲は... 〜100、100〜200、200〜500、500〜です。 ....。

インデックスを作成するための最も簡単な構文:CREATE INDEX [インデックス名] ON [テーブル名](テーブルフィールド名)。テーブル名user_indexesおよびall_indexesは、インデックス情報を表示できます。テーブル名user_ind_columns、all_ind_columnsは、インデックス関連の情報を表示します。

インデックスの断片化とは、インデックスに関連付けられたデータが削除され、インデックス情報がまだ存在する場合、このデータのインデックスはインデックスの断片化と呼ばれる役に立たないインデックスです。役に立たない情報はメモリを占有し、Oracleのパフォーマンスに影響します。断片化を減らす1つの方法は、インデックスを再構築することです。

インデックスステートメントを分析します。ANALYZEINDEX[インデックス名] VALIDATE STRUCTURE;次に、INDEX_STATSをクエリして、pct_usedインデックスフラグメントの数を確認します。

まず、1.300000データのテーブルを作成します。インデックスの効果を見てみましょう。

--drop table salary_tbl;

create  table salary_tbl(
   employer_nm varchar(20),
   department varchar(20) not null,
   salary number not null,
   leader_nm varchar(20)
);
truncate table salary_tbl;
begin
 for i in  1..1300000
     loop
     insert into salary_tbl values('雇佣者'||i,'部门'||Mod(i,50),100+sqrt(i),'雇佣者'||Mod(i,20)); 
     if Mod(i,1000)=0 then 
       commit;
     end if;
   end loop;
end; 
/
commit;


新しいインデックスとクエリ情報を作成します。

create index idx1 on salary_tbl(DEPARTMENT);
ANALYZE INDEX IDX1 VALIDATE STRUCTURE;     --分析索引
select s.name,s.pct_used,s.blocks from  INDEX_STATS s ;

現時点では、PCT_USEDの指定された最大値が90であるため、インデックスの断片化はありません。

データを削除した後、インデックスを分析し、インデックス情報を確認します。

このときのPCT_USEDの使用率が低下し、インデックスの断片化が発生しました。使用率を上げる1つの方法は、インデックスを再構築することです。

ALTER INDEX IDX1 REBUILD;  -- ALTER INDEX [索引名] REBUILD
ANALYZE INDEX IDX1 VALIDATE STRUCTURE;
select s.name,s.pct_used,s.blocks from  INDEX_STATS s ;

インデックスが再構築された後、使用率は再び上昇しました。

一意のインデックス:一意のインデックスと呼ばれる、インデックスに関連付けられた列に重複する値がないことを確認し、[テーブル名](列名)に一意のインデックス[インデックス名]を作成します。一意とは一意であることを意味します。繰り返された。インデックスに関連付けられたフィールド値を繰り返すことはできません。繰り返すとエラーが報告されますが、関連付けられたフィールドでは複数のnull値を使用できます。

 

複合インデックス:インデックスは複数のフィールドに関連付けることができ、複数のフィールドに関連付けられたインデックスは複合インデックスと呼ばれます。[テーブル名](列名1、列名2 ...)にインデックス[インデックス名]を作成します。クエリを高速化できるステートメントは、select * from [table] where column name 1 = .. and column name 2 ...そのようなステートメント。

 

逆キー索引:各索引リーフ・ノードにデータを均等に分散するために、オラクルは、一部のリーフ・ノードでデータが多すぎ、一部のリーフ・ノードでデータが小さすぎるという問題を回避するために、逆キー索引を提供しています。キー値は逆の順序で並べ替えられます。一般的なインデックスと比較して、キー値が連続している場合は、それらがすべて同じデータブロックに配置されていることを意味します。2つの隣接するキー値にアクセスする場合は、同じものが同時に取得されます。データブロック。リバースキー値の場合、2つの隣接するキー値は同じデータブロックに配置されず、相互に取得することはありませんが、キー値間の関係がなくなったため、リーフはすぐになくなります双方向接続の機能。したがって、SQL構文条件が=の場合、最大の効果が得られます。

[テーブル名](列名)にインデックス[インデックス名]を作成しますREVERES;

たとえば、関連付けられたフィールド値は1001 1002、3211、3212、3213であり、逆キー値は1001 2001 1123 2123 3123です。この値を使用して、インデックスを作成します。

 

関数インデックス:関連付けられたキー値は、関数によって計算された値です。where関数(フィールドの場合)= ...でクエリを高速化できます。作成時にQUERYREWRITE権限が必要であり、LOBタイプの列には作成できません。

      [テーブル名](関数名(パラメーター))にインデックス[インデックス名]を作成します。

 

ビットマップインデックス(ビットマップインデックス):ビットマップインデックスはBツリーインデックスに属していません。2つの間に大きな違いがあります。Bツリーインデックスキー値の後にROWIDが続き、ビットマップインデックスのキー値の後にビット文字列(String of bit)が続きます。これは、「0」と「1」の文字列です。ビットマップインデックスは、インデックススペースを効果的に節約できます。これは、カーディナリティの低い列での作成に適しています。いわゆるカーディナリティの低い列は、値が非常に少ないフィールドを指します。たとえば、gender =( 'male'、 'female'); grade =( '1'、 '2'、 '3')のようになります。

     [テーブル名](列名)にビットマップインデックス[インデックス名]を作成します。

    

Bツリーインデックス ビットマップインデックス
学生ID、IDカードなどのインデックスキー値が多い場合に適しています。 性別、血液型、グレードなど、インデックスキー値が比較的少ないフィールドに適しています。
多くの場合、変更操作を実行できます 変更を実行するコストは高くなります
'or'式には非常に非効率的 または式に適したSQL構文 
頻繁に変更されるシステムであるオンライン取引システム(OTP)に適しています データウェアハウス、大量のデータがあるが変更の頻度が低いシステムに適用可能

 

インデックスの完全な構文を再構築します。ALTERINDEXindex_nameREBULID [オンライン] [NOLOGING] [COMPUTE STATISTICS]

オンライン:インデックスをオンラインで再構築します。インデックスを再構築する過程で、他のユーザーが追加、削除、変更できます。作成するインデックスの数が多すぎると、インデックスの構築に時間がかかります。通常は状況により、この期間中にこれを行うことは禁じられています。インデックスの追加、削除、および変更は、ビジネスに影響を与える可能性があります。これは、オンラインに設定することで回避できます。

NOLOGGING:再構築プロセス中の最小のREDOエントリREDOエントリを表します。

COMPUTE STATISTICS:オプティマイザーに必要な統計情報は、再構築プロセス中に生成されます。再構築後に手動で分析したり、dbms_statsを実行したりする必要はありません。

 

2.インデックスパーティション:

       インデックスパーティションには、ローカルパーティションインデックス、グローバルパーティションインデックス、グローバル非パーティションインデックスの3種類があります。パーティションインデックスは、user_indexesテーブルとuser_ind_partitionsテーブルで検索できます。

ローカルパーティションインデックス:パーティションテーブルに作成されたインデックス。インデックスのパーティション範囲はテーブルのパーティション範囲と同じです。[テーブル名](フィールド)ローカルにインデックス[インデックス名]を作成します。テーブルがどのようにパーティション化されるかによって、ローカルパーティションインデックスがパーティション化されます。

グローバルパーティションインデックス:[テーブル名](フィールド)にインデックス[インデックス名]を作成します。グローバルパーティション.......:インデックスのパーティションを手動でカスタマイズします。テーブルのパーティションステータスはインデックスパーティションとは関係がなく、インデックスのパーティションがカスタマイズされます。

グローバル非パーティションインデックス:パーティションテーブル上に作成されたグローバル通常インデックス。インデックスはパーティション化されていません。[テーブル名](フィールド)グローバルにインデックス[インデックス名]を作成します。

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/superSmart_Dong/article/details/104573097