1. ホーム
  2. データベース
  3. 神託

オラクルインデックス概要

2022-01-07 11:01:10

I. はじめに

説明

  1. インデックスとは、本の索引のように、データの検索を高速化するために使用されるデータベースオブジェクトの1つである。データベース内のインデックスは、データベースプログラムが結果を問い合わせる際に読み込む必要があるデータの量を減らすことができます。これは、本のインデックスを使えば、本全体に目を通すことなく欲しい情報を見つけることができるのと同様です。
  2. インデックスとは、テーブル上に構築されるオプションのオブジェクトです。インデックス作成の鍵は、デフォルトのフルテーブルスキャン検索を、ソートされたインデックスキーの集合に置き換え、検索の効率を向上させることです。
  3. インデックスは、関連するテーブルやデータから論理的にも物理的にも独立しています。インデックスを作成または削除しても、その下にあるテーブルには影響しません。
  4. インデックスが作成されると、テーブルに対してDML操作が行われた場合(例えば、挿入、変更、または削除関連の操作を実行した場合)、以下のようになります。 oracle は自動的にインデックスを管理し、テーブルに影響を与えることなくインデックスが削除されます。
  5. テーブルがインデックスを持つかどうかに関係なく、SQL文の使用法は同じままです。
  6. oracle 主キーを作成すると、そのカラムに自動的にインデックスが作成される

第二に、インデックスの原則

  • インデックスがない場合、レコードを検索するとき(たとえば name='wish' )は、すべてのレコードを検索する必要があります。なぜなら、ウィッシュが1つしかない保証はないからです。
  • で検索すると name がインデックス化されると oracle はテーブル全体を検索し、各レコードの name の値を取得し、インデックス・エントリを構築します。 name rowid ) が、インデックスセグメントに格納され、クエリ name に対して wish の場合、対応する場所を直接見つけることができます。
  • インデックスを作成したからといって、必ずしも使用されるとは限りません。 oracle テーブル内のデータが非常に少ない場合は、フルテーブルスキャンで十分速く、インデックスを使用する必要はない。

第三に、インデックスの使用(作成、変更、削除、閲覧)について

1. インデックス作成構文

CREATE [UNIQUE] | [BITMAP] INDEX index_name --unique means unique index
ON table_name([column1 [ASC|DESC],column2 --bitmap, create bitmap index
[ASC|DESC],...] | [address])
[TABLESPACE tablespace_name]
[PCTFREE n1] -- Specify the free space in the data block for the index
[STORAGE (INITIAL n2)]
[NOLOGGING] -- indicates that DML operations on the table are allowed when creating and rebuilding the index, which should not be used by default
[NOLINE]
[NOSORT]; -- indicates that indexes are created without sorting, not applicable by default, can be used if the data is already in the order of the index



2. インデックスの修正

1) インデックス名を変更する

alter index index_sno rename to bitmap_index;




2) マージインデックス

(テーブルの断片化は、一定期間後にインデックスに発生する、インデックスの効率が低下すると、インデックスを再構築したり、インデックスをマージすることを選択することができます、マージされたインデックスは、より良い、追加のストレージ容量、安価です)。

alter index index_sno coalesce;




3. インデックスの再構築

方法 I. 元のインデックスを削除し、再作成する

方法2

alter index index_sno rebuild;




3. インデックスを削除する

drop index index_sno;




4. インデックスを見る

select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name = 'tablename';

 -- eg:    
create index index_sno on student('name');
select * from all_indexes where table_name='student';


IV. インデックスの分類

1. B-treeインデックス

(ソートされたインデックス列とそれに対応する rowid 値を保持するデフォルトのインデックス)

1)説明

  1. oracle B-treeインデックスは2分木であり、リーフノード(2方向に連結されたテーブル)にはインデックスカラムと ROWID
  2. すべてのリーフノードの深さが同じなので、クエリ条件に関係なく、クエリの速度は基本的に同じです
  3. 正確なクエリ、ファジーなクエリ、比較クエリに対応

2)分類

   UNIQUE,NON-UNIQUE (デフォルト),REVERSE KEY (データ列のデータは逆順に格納される)

3) 例を作成する

craete index index_sno on student('sno');
 



4)シナリオでの使用に適している。

B数インデックスは、列の基数(繰り返しのない値の数)が多い場合に適している

2. ビットマップインデックス

1)説明

1. ビットマップインデックスを作成するとき、オラクルはテーブル全体をスキャンし、インデックス列の値ごとにビットマップを作成します(ビットマップでは、テーブル内の各行に対して1ビット(ビット、0または1)を使用して、行がビットマップのインデックス列の値を含むかどうかを識別し、それが1であれば、それは対応する行IDはビットマップのインデックス列の値を含むことを意味します)、最後に、ビットマップのインデックスでマッピング関数を通じて最後に、行ROWIDへのビットマップから変換はビットマップのインデックスでマッピング関数によって行われていることです

2) 例を作成する

create bitmap index index_sno on student(sno);




3)適したシナリオ

レジュメビットマップインデックスに適したベースが小さい列の場合(例:性別など)

3. 単一列インデックスおよび複合インデックス(複数の列を基に作成されたインデックス)

1)そのことに注意する。

  すなわち、インデックスが複数のカラムで構築されている場合、オプティマイザはその最初のカラムがwhere句で参照されている場合にのみインデックスを使用します、すなわち、少なくとも結合したインデックスの最初のカラムを含んでいなければなりません。

4. 関数インデックス

1)説明

  1. ある関数や式が頻繁にアクセスされる場合、それらをインデックスに格納することで、次回アクセス時にすでに値が計算されているため、クエリを高速化することができる

  2. 関数のインデックスには、B-numberインデックスとビットマップインデックスの両方を使用できます。B-treeインデックスは関数の結果が不確定な場合に使用し、ビットマップインデックスは結果が固定数の値である場合に使用します

  3. 関数インデックスをセメントで固めるには

len
trim
, substr
, upper
(each line returns a separate result), you cannot use the
sum
,
max
, min
, avg
etc.
 2) Example.
create index fbi on student (upper(name));
select * from student where upper(name) = 'WISH';




V. Summary of indexing principles
If there are two or more indexes, one of which is unique and the other is non-unique, then oracle will use the unique index and ignore the non-unique index altogether
At least the first column of the combined index must be included (i.e. if the index is built on more than one column, the optimizer will only use the index if its first column is referenced by the where clause)
Don't resume indexes for small tables
For columns with large bases suitable for building B-tree indexes, for columns with small bases suitable for resume bitmap indexes
There are many null values in the column, but you should build an index when you frequently query the non-null rows on the column
 Columns that are frequently queried with joins should be indexed
When using create index, put the most frequently queried columns first
LONG (variable-length string data, up to 2G) and LONG RAW (variable-length binary data, up to 2G) columns cannot be indexed
Limit the number of indexes in the table (creating indexes is time-consuming and increases with the amount of data; indexes take up physical space; when adding, deleting, and modifying data in the table, indexes are also dynamically maintained, reducing the speed of data maintenance)
Caution.
1. oracle cannot use indexes when wildcards appear at the beginning of search terms, eg.
--we create index on name.

create index index_name on student('name');

--oracle does not apply the name index in the following way

select * from student where name like '%wish%';

-- The optimizer can take advantage of the index if the wildcard character appears in another position in the string; as follows.

select * from student where name like 'wish%';



 2. do not use not on the index column, you can use other ways instead as follows: (oracle will stop using the index when it encounters not, and use full table scan)
select * from student where not (score=100);

select * from student where score <> 100;

--replace with

select * from student where score>100 or score <100



 3. Using null comparison on index will stop using index, eg.
select * from student where score is not null;


At this point this article on
oracle
This is the summary of the index article, more related oracle index content please search the Codedevlib previous articles or continue to browse the following related articles hope you will support the Codedevlib more!

create index fbi on student (upper(name));
select * from student where upper(name) = 'WISH';





--we create index on name.

create index index_name on student('name');

--oracle does not apply the name index in the following way

select * from student where name like '%wish%';

-- The optimizer can take advantage of the index if the wildcard character appears in another position in the string; as follows.

select * from student where name like 'wish%';



 3. Using null comparison on index will stop using index, eg.

oracle