オラクルインデックス概要
I. はじめに
説明
- インデックスとは、本の索引のように、データの検索を高速化するために使用されるデータベースオブジェクトの1つである。データベース内のインデックスは、データベースプログラムが結果を問い合わせる際に読み込む必要があるデータの量を減らすことができます。これは、本のインデックスを使えば、本全体に目を通すことなく欲しい情報を見つけることができるのと同様です。
- インデックスとは、テーブル上に構築されるオプションのオブジェクトです。インデックス作成の鍵は、デフォルトのフルテーブルスキャン検索を、ソートされたインデックスキーの集合に置き換え、検索の効率を向上させることです。
- インデックスは、関連するテーブルやデータから論理的にも物理的にも独立しています。インデックスを作成または削除しても、その下にあるテーブルには影響しません。
-
インデックスが作成されると、テーブルに対してDML操作が行われた場合(例えば、挿入、変更、または削除関連の操作を実行した場合)、以下のようになります。
oracle
は自動的にインデックスを管理し、テーブルに影響を与えることなくインデックスが削除されます。 - テーブルがインデックスを持つかどうかに関係なく、SQL文の使用法は同じままです。
-
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)説明
-
oracle
B-treeインデックスは2分木であり、リーフノード(2方向に連結されたテーブル)にはインデックスカラムとROWID
値 - すべてのリーフノードの深さが同じなので、クエリ条件に関係なく、クエリの速度は基本的に同じです
- 正確なクエリ、ファジーなクエリ、比較クエリに対応
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
関連
-
Oracle12Cのデフォルトのユーザー名とシステムパスワードが正しくない場合の解決策
-
LogMinerによるOracle Databaseの同期マイグレーション
-
plsqlを使用してリモートOracleデータベースに接続する複数の方法
-
Oracleのカンマ区切り文字列を複数行に分割したデータ例
-
[解決済み】ORA-30926:ソーステーブルの安定した行のセットを取得できません。
-
[解決済み] ORA-01465: BLOB を使用しているとき、Oracle の 16 進数が無効です。
-
[解決済み] ORA-01799: 列がサブクエリに外部結合されていない可能性があります。
-
[解決済み] PLS-00382: 式が不正です。
-
[解決済み] oracle pl/sql DBMS_LOCK エラー
-
[解決済み] カラムが存在するにもかかわらず、ORA-00904が発生するのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
オラクルのブロック修正追跡機能の説明
-
オラクルのファジー・クエリーとその使い方
-
Oracle TriggersとCursorsを高速に学ぶ
-
Oracleで読み取り専用アカウントを作成する詳細手順
-
Oracle 11g R2 インストールチュートリアル フルバージョン
-
Oracleトレースファイルの詳細な使用方法
-
[解決済み] PLS-00302: component must be declared when it exists?」と表示されます。
-
[解決済み] ORA-00980 PLSQL で同義語の翻訳が有効でなくなった。
-
[解決済み] SQLステート [72000]; エラーコード [14300]; JDBCバッチアップデートを実行できませんでした。
-
[解決済み] ORA-01460: 未実装または不当な変換が要求されました。