記事のディレクトリ
、Oracleのインデックスはじめに
ノートブックに編成し、実践マニュアルの例をもとに、「SQLの最適化、より多くの収穫、」、見てみます
1.1分類インデックス
Oracleのインデックスは、その上のbtreeインデックス、ビットマップ索引、逆インデックス、関数インデックス、フルテキストインデックスとに分かれています。
1.2インデックスのデータ構造
Oracleは、最も一般的に使用されるインデックスBツリーインデックスであるので、Bツリーの例とインデックスは、Bツリーインデックスの話を、インデックスデータ構造は、バイナリツリー、ルートインデックスブロック(ルート)、塊茎(支店)、リーフブロックのBツリー構造であり、 (葉)、リーフブロックインデックス列は、主に特定の値(キー列の値)を記憶し、下側のインデックスに対応する主記憶に対応するROWIDの特定の位置、塊茎及び根ブロックをブロックするように配置することができます
1.3インデックス機能
インデックス機能:
- インデックス自体が秩序あります
- インデックス自体は、列の値を格納することができます
1.4インデックス・ポイントの使用を注意してください
- (1)、パフォーマンスへの影響なしに配列だけでなく同等の範囲クエリ
drop table t purge;
create table t as select * from dba objects;
update t set object_id=rownum ;
commit;
create index idx_id_type on t(object_id, object_type) ;
create index idx_type_id on t(object_type , object_id) ;
set autotrace off;
alter session set statistics_level=all ;
select /*+index(t idx_id_type)*/ * from t where object_id=20 and object_type='TABLE';
select * from table(dbms_xplan.display cursor(null , null , 'allstats last'));
select /*+index(t,idx_type id)*/ * from t where object_id=20 and object_type= 'TABLE';
select * from table(dbms_xplan.display cursor(null , null , 'allstats last'));
- (2)、クエリの範囲、一般的に逆の好ましい配列のインデックス組合せフロントカラム等価クエリ
select /*+index (t, idx_id_type)*/ * from t where object_id>=20 and object_id<2000 and
object_type='TABLE';
select /*+index (t , idx_type_id) */ * from t where object_id>=20 and object_id<2000
and object type='TABLE';
- (3)、オラクルは、二つのルートインデックスの最大値と最小値を見つけることができません
set autotrace on
select max(object_id) , min(object_id) from t;
直積文言:
set autotrace on
select max, min
from (select max(object_id) max from t ) a ,
(select min(object_id) min from t ) b;
- (4)、最新のインデックスデータ・ブロックは、右端にあるのが一般的です
1.5欠点、インデックス
- 競争の高速熱:右端一般的には、最新のインデックスデータ・ブロックが、また、一般的なアクセスデータがアクセスされた比較的新しいが、そう簡単に高速な競争を加熱するために導きます
- インデックス自体は秩序あるので、すぐにクエリ時間が、時にトラブルに更新されますが、新しい更新インデックスはソートすることを確認してください:新しい問題を更新します。
1.6、インデックスに失敗しました
論理的および物理的な障害に異常異常指数
- 論理障害
いくつかのSQL構文は、このような多くの機能を追加するなど、インデックスの故障につながるので、ロジックが失敗し、インデックス列は、機能的指標ではありません - 物理障害
物理的な障害が本当に失敗され、使用できないプロパティが用意されているような、パーティションテーブルのインデックスはまた、障害が発生した場合などの異常動作につながることができます
alter index index_name unusable;
第二に、インデックスカテゴリ説明
インデックスカテゴリ:Bツリーインデックス、ビットマップ・インデックス、関数インデックスは、インデックス、フルテキストインデックスを逆転します
2.1、ビットマップ索引
ビットマップ索引:ビットマップインデックスが格納されているビットの値
ビットマップ・インデックス・カウントに適用されるプロパティ、最大効率、環境準備
drop table t purge;
create table t as select * from dba_objects;
update t set object_id = rownum;
commit;
ないインデックスの場合:
SQL> set autotrace on
SQL> select count(*) from t;
COUNT(*)
----------
72016
执行计划
----------------------------------------------------------
Plan hash value: 2966233522
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 288 (1)| 00:00:04 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| T | 86565 | 288 (1)| 00:00:04 |
-------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
4 recursive calls
0 db block gets
1111 consistent gets
0 physical reads
0 redo size
432 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL>
ビットマップ索引を作成します。
create bitmap index idx_bitm_t_status on t(status);
ビットマップ索引のクエリを行って、再び照会します:
SQL> set autotrace on
SQL> select count(*) from t;
COUNT(*)
----------
72016
执行计划
----------------------------------------------------------
Plan hash value: 4272013625
--------------------------------------------------------------------------------
-----------
| Id | Operation | Name | Rows | Cost (%CPU)|
Time |
--------------------------------------------------------------------------------
-----------
| 0 | SELECT STATEMENT | | 1 | 5 (0)|
00:00:01 |
| 1 | SORT AGGREGATE | | 1 | |
|
| 2 | BITMAP CONVERSION COUNT | | 86565 | 5 (0)|
00:00:01 |
| 3 | BITMAP INDEX FAST FULL SCAN| IDX_BITM_T_STATUS | | |
|
--------------------------------------------------------------------------------
-----------
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
6 consistent gets
0 physical reads
0 redo size
432 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL>
注意点:
ビットマップ・インデックスの更新がデッドロックの列を引き起こす可能性があり、列は、クエリがインデックスを構築しないようにしようとするより多くの列が更新されたビットマップ索引を構築するために、より適していそうでした
1.2関数インデックス
関数インデックスは:計算結果の関数は、列の行に格納されています
環境を準備します:
drop table t purge;
create table t (id int, status varchar2(2));
insert into t select 1,'N' from dual;
insert into t select rownum ,'Y' from dual connect by rownum <1000;
commit;
インデックスクエリを取っていません。
SQL> set autotrace on
SQL> select * from t where (case when status='N' then 'No' end)='No';
ID STAT
---------- ----
1 N
执行计划
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 16 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 1 | 16 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(CASE "STATUS" WHEN 'N' THEN 'No' END ='No')
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
8 consistent gets
0 physical reads
0 redo size
486 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL>
機能的なインデックスを作成します:
create index idx_status on t (case when status ='N' then 'No' end);
関数インデックスのクエリを行きます:
SQL> select * from t where (case when status='N' then 'No' end)='No';
ID STAT
---------- ----
1 N
执行计划
----------------------------------------------------------
Plan hash value: 3908194542
--------------------------------------------------------------------------------
----------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
Time |
--------------------------------------------------------------------------------
----------
| 0 | SELECT STATEMENT | | 10 | 200 | 2 (0)|
00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 10 | 200 | 2 (0)|
00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_STATUS | 4 | | 1 (0)|
00:00:01 |
--------------------------------------------------------------------------------
----------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access(CASE "STATUS" WHEN 'N' THEN 'No' END ='No')
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
486 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL>
注意点:
カスタムキーワードに決定的関数を追加するには、または機能指標を確立することはできません
カスタム関数を構築します:
create or replace function f_addusl(i int) return int is
begin
return(i + 1);
end;
機能的な指標を確立しよう:
create index idx_ljb_test on t(f_addusl(id));
ヒント:ORA-30553:機能は決定できません
決定論的なキーワードを使用すると、機能的なインデックスを作成することができます
create or replace function f_addusl(i int) return int deterministic is
begin
return(i + 1);
end;
カスタムコードの更新機能は、インデックスに対応する機能も再構築されます、または元の関数インデックスを使用できない場合
1.3、転置インデックス
リバースインデックス:転置インデックスは、実際に特殊なケースBツリーインデックスではなく、列のバイトが逆になりますが(インデックスは、このような列に格納されたインデックス列の値のような、増加しているとして、競争の速い熱を避けるためであるリバース250101,250102は、特性Bツリーインデックスによると、一般的に右側に格納された順序インデックスには、熱高速競争を形成することが容易であり、逆索引が格納されているので、逆インデックスは、101052,201052として、このような状況を回避します列の値)は、非常に遠く離れており、競争の速い熱を避けるように、
転置インデックス範囲クエリは使用できません。
SQL> set autotrace on
SQL> select * from t where created=sysdate;
未选定行
执行计划
----------------------------------------------------------
Plan hash value: 913247507
--------------------------------------------------------------------------------
---------------
| Id | Operation | Name | Rows | Bytes | Cost (%C
PU)| Time |
--------------------------------------------------------------------------------
---------------
| 0 | SELECT STATEMENT | | 12 | 2484 | 286
(0)| 00:00:04 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 12 | 2484 | 286
(0)| 00:00:04 |
|* 2 | INDEX RANGE SCAN | IDX_REV_CREATED | 346 | | 1
(0)| 00:00:01 |
--------------------------------------------------------------------------------
---------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CREATED"=SYSDATE@!)
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
1191 bytes sent via SQL*Net to client
408 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
SQL>
範囲クエリは、見つかった逆インデックスクエリを取ることはありません
SQL> select * from t where created>= sysdate-10 and created <= sysdate-1;
OWNER
------------------------------------------------------------
OBJECT_NAME
--------------------------------------------------------------------------------
SUBOBJECT_NAME OBJECT_ID
------------------------------------------------------------ ----------
DATA_OBJECT_ID OBJECT_TYPE CREATED
-------------- -------------------------------------- --------------
LAST_DDL_TIME TIMESTAMP STATUS TE GE SE
-------------- -------------------------------------- -------------- -- -- --
NAMESPACE EDITION_NAME
---------- ------------------------------------------------------------
SYS
ICOL$
20
2 TABLE 15-6月 -19
02-4月 -10 2010-04-02:13:18:38 VALID N N N
1
SYS
I_USER1
46
46 INDEX 14-6月 -19
OWNER
------------------------------------------------------------
OBJECT_NAME
--------------------------------------------------------------------------------
SUBOBJECT_NAME OBJECT_ID
------------------------------------------------------------ ----------
DATA_OBJECT_ID OBJECT_TYPE CREATED
-------------- -------------------------------------- --------------
LAST_DDL_TIME TIMESTAMP STATUS TE GE SE
-------------- -------------------------------------- -------------- -- -- --
NAMESPACE EDITION_NAME
---------- ------------------------------------------------------------
02-4月 -10 2010-04-02:13:18:38 VALID N N N
4
SYS
CON$
28
28 TABLE 13-6月 -19
02-4月 -10 2010-04-02:13:18:38 VALID N N N
1
SYS
OWNER
------------------------------------------------------------
OBJECT_NAME
--------------------------------------------------------------------------------
SUBOBJECT_NAME OBJECT_ID
------------------------------------------------------------ ----------
DATA_OBJECT_ID OBJECT_TYPE CREATED
-------------- -------------------------------------- --------------
LAST_DDL_TIME TIMESTAMP STATUS TE GE SE
-------------- -------------------------------------- -------------- -- -- --
NAMESPACE EDITION_NAME
---------- ------------------------------------------------------------
UNDO$
15
15 TABLE 12-6月 -19
02-4月 -10 2010-04-02:13:18:38 VALID N N N
1
SYS
C_COBJ#
29
29 CLUSTER 11-6月 -19
02-4月 -10 2010-04-02:13:18:38 VALID N N N
OWNER
------------------------------------------------------------
OBJECT_NAME
--------------------------------------------------------------------------------
SUBOBJECT_NAME OBJECT_ID
------------------------------------------------------------ ----------
DATA_OBJECT_ID OBJECT_TYPE CREATED
-------------- -------------------------------------- --------------
LAST_DDL_TIME TIMESTAMP STATUS TE GE SE
-------------- -------------------------------------- -------------- -- -- --
NAMESPACE EDITION_NAME
---------- ------------------------------------------------------------
5
SYS
I_OBJ#
3
3 INDEX 10-6月 -19
02-4月 -10 2010-04-02:13:18:38 VALID N N N
4
SYS
PROXY_ROLE_DATA$
OWNER
------------------------------------------------------------
OBJECT_NAME
--------------------------------------------------------------------------------
SUBOBJECT_NAME OBJECT_ID
------------------------------------------------------------ ----------
DATA_OBJECT_ID OBJECT_TYPE CREATED
-------------- -------------------------------------- --------------
LAST_DDL_TIME TIMESTAMP STATUS TE GE SE
-------------- -------------------------------------- -------------- -- -- --
NAMESPACE EDITION_NAME
---------- ------------------------------------------------------------
25
25 TABLE 09-6月 -19
02-4月 -10 2010-04-02:13:18:38 VALID N N N
1
SYS
I_IND1
41
41 INDEX 08-6月 -19
02-4月 -10 2010-04-02:13:18:38 VALID N N N
4
OWNER
------------------------------------------------------------
OBJECT_NAME
--------------------------------------------------------------------------------
SUBOBJECT_NAME OBJECT_ID
------------------------------------------------------------ ----------
DATA_OBJECT_ID OBJECT_TYPE CREATED
-------------- -------------------------------------- --------------
LAST_DDL_TIME TIMESTAMP STATUS TE GE SE
-------------- -------------------------------------- -------------- -- -- --
NAMESPACE EDITION_NAME
---------- ------------------------------------------------------------
SYS
I_CDEF2
54
54 INDEX 07-6月 -19
02-4月 -10 2010-04-02:13:18:38 VALID N N N
4
已选择9行。
执行计划
----------------------------------------------------------
Plan hash value: 1322348184
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 2484 | 292 (2)| 00:00:04 |
|* 1 | FILTER | | | | | |
|* 2 | TABLE ACCESS FULL| T | 12 | 2484 | 292 (2)| 00:00:04 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(SYSDATE@!-10<=SYSDATE@!-1)
2 - filter("CREATED">=SYSDATE@!-10 AND "CREATED"<=SYSDATE@!-1)
Note
-----
- dynamic sampling used for this statement (level=2)
统计信息
----------------------------------------------------------
5 recursive calls
0 db block gets
1112 consistent gets
0 physical reads
0 redo size
1770 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
9 rows processed
SQL>
1.4、フルテキストインデックス
フルテキストインデックス:Oracleの字句解析(レクサー)による、いわゆるフルテキストインデックスのOracleのすべての表意文字表示される用語格納部、番号、ハッシュ値情報のテーブルなど、OracleがBASIC_LEXERを提供する(開始用語メモリのDR $英語)、CHINESE_VGRAM_LEXER(中国語アナライザ)、CHINESE_LEXER(新中国アナライザ)。
- BASIC_LEXER:中国のためにスペースはありませんので、このアナライザは、中国には適していませんかワードスペースまたは句読点の細胞分離に応じて、英語用のパーサ、
- CHINESE_VGRAM_LEXER:これは、特別な中国の元のパーサー、すべての中国の文字セットのサポート、などZHS16GBK単一点です。プロセスを分析するために、この分析は、この分析によれば、語彙単位「ケーブル」に分割され、例えば、「インデックス自体が順序付けされる」という言葉を用いて分析され、「インデックス」、「プライマーの存在「」それ自体「」体である、 『』そこ「」注文「」注文 『と』中 『これらの言葉の元、とのように、あなたは見つける』中国におけるこれらの単語の配列」は基本的に真実ではありませんが、それ自体で、これは中国のオラクル・アナライザを知らない、それは効率が良くないことが明らかにのみ、すべての分析であることができます
- CHINESE_LEXER:これは新しい中国のアナライザで、このアナライザは、すべての中国の文字セットのサポートがCHINESE_VGRAM_LEXERを述べたが、効率は高くないので、CHINESE_LEXERはそれの改良版で、このアナライザは、中国の語彙をたくさん知っていますより速く、より効率的なクエリを実行することができますが、この解析は、UTF-8文字セットをサポートすることができます
Oracleのフルテキストインデックスコンクリートは、分類、おおよその検索、単語の意味と重み付き拡張や他の方法の条件に関連したワイルドカード、ファジー・マッチングを見つけるために使用することができます
環境の準備
drop table t purge;
create table t as select * from dba_objects where object_name is not null;
update t set object_name ='高兴' where rownum<=2;
commit;
select * from t where object_name like '%高兴%';
字句解析の設定
//设置词法分析器
BEGIN
ctx_ddl.create_preference ('lexer1', 'chinese_vgram_lexer');
END;
あなたのテストアカウントを(私はスコットを使用)与えながら、CTXSYSユーザーのロックを解除しCTX_DDLの使用を許可
//解锁ctxsys用户同时授权
grant ctxapp to scott;
alter user ctxsys account unlock;
alter user ctxsys identified by ctxsys;
connect ctxsys/ctxsys;
grant execute on ctx_ddl to scott;
connect scott/11;
フルテキストインデックスを作成します
//删除全文索引
drop index idx_content;
//查看数据文件信息
select * from v$datafile;
//建立全文索引
CREATE INDEX idx_content ON t(object_name) indextype is ctxsys.context parameters('lexer lexer1');
注意点:常にデータ同期がフルテキストインデックス処理を実行するコマンドを更新しようとする、またはそれらは、更新データは表示されません
exec ctx_ddl.sync_index('idx_content','20M');