oracle 5種類のインデックス作成

6547 ワード

http://database.51cto.com/art/201010/231388.htm
Oracleデータベースでインデックスを使用するには、まずOracleインデックスを作成する必要があります.Oracleインデックスを作成する方法を紹介します.ご協力をお願いします.
インデックスの適切な使用は、データ検索速度を向上させ、常にクエリが必要なフィールドにインデックスを作成することができます.oracleの索引は5種類に分けられます.一意の索引、結合索引、逆の結合索引、ビットマップ索引、関数に基づく索引
Oracleインデックスを作成する標準文法:
CREATE INDEXインデックス名ONテーブル名(列名)
TABLESPACE表空間名;
一意の索引を作成:
CREATE unique INDEXインデックス名ONテーブル名(列名)
TABLESPACE表空間名;
グループインデックスを作成:
CREATE INDEXインデックス名ONテーブル名(列名1、列名2)
TABLESPACE表空間名;
逆方向キーインデックスの作成:
CREATE INDEXインデックス名ONテーブル名(列名)reverse
TABLESPACE表空間名;
以上、Oracleインデックスを作成する方法を紹介しました.
 
=====
http://database.51cto.com/art/201010/231096.htm
Oracle関数インデックスを使用することは、クエリ効率を向上させる効果的な方法の一つに違いない.Oracle関数インデックスの使い方を詳しく紹介します.ご協力をお願いします.
任意の列の動作について言及すると、全テーブルスキャンを引き起こす可能性があります.

  
  
  
  
  1. select * from emp where substr(ename,1,2)=’SM’; 
しかし、このようなクエリは、カスタマーサービスシステムでもよく使われています.substr関数を持つOracle関数インデックスを作成できます.

  
  
  
  
  1. create index emp_ename_substr on eemp ( substr(ename,1,2) ); 
しかし、このようなクエリは、カスタマーサービスシステムでもよく使われています.substr関数を持つOracle関数インデックスを作成できます.

  
  
  
  
  1. create index emp_ename_substr on eemp ( substr(ename,1,2) ); 
このように、上記のクエリ文を実行する際には、この関数ベースのインデックスが役立ちます.実行計画はINDEX RANGE SCANです.上記の例では、関数ベースの索引を作成しましたが、下記のクエリーを実行すると、

  
  
  
  
  1. select * from emp where substr(ename,1,1)=’S’ 
得られた実行計画はやはり(TABLE ACCESS FLL)であり、データ列が等式的にマッチングできる場合にのみ、関数ベースのインデックスが有効となるため、このインデックスに対する計画とメンテナンスの要求は高い.テーブルにインデックスを追加することは、多くのクエリ実行計画の変更を招く危険な操作です.しかしながら、関数ベースのインデックスを使用すると、Oracleはマッチングした内蔵関数をクエリに使用した場合にのみこのタイプのインデックスを使用するので、このような問題は発生しない.
=====
http://space.itpub.net/21805468/viewspace-618068
oracleのビットマップ索引
前編/下編 2009-11-03 23:09:11/個人分類:oracle
表示(458)/コメント(2)/評価(
10/
0)
ビットマップインデックスは、低ベースの列に適用されます.いわゆる低ベースの数列とは、この列のわずかな値です.
ビットマップインデックスの問題:ビットマップ索引を使用して、1つのキーが複数の行を指し、百計またはそれ以上を数えることができます.ビットマップ索引キーを更新すると、このキーが指す数百のレコードは、実際に更新された行とともに有効にロックされます.
ビットマップインデックスの適用シーン:ビットマップインデックスは、値があまり変わらないフィールドに対して、実際のアプリケーションでは、あるフィールドの値が頻繁に更新される必要がある場合、ビットマップインデックスを作成するのに適していません.
以下はビットマップインデックスに対する実験である.1.準備環節:--表t SQL>create table tを作成する.
テーブルが作成されました
--表tでのプロcessed_flagsはビットマップインデックスSQLを作成します.create bitmap index t_idx on;
インデックスが作成されました
2.sql*plusセッションに列の値をNとするレコードを挿入し、まずcommtではない.その後、他のsql*plusセッションにも行列値Nの記録が挿入されます.その後、後ろのセッションがブロックされていることが分かります.session 1 SQL>insert into t values('N')
1行が作成されましたinsertの後に提出しないと、ビットマップ索引のNキーがロックされます.どのDML文もNと関係があるとブロックされます.
--session 2 SQL>insert into t values('N')この文は掛けられています
--ロック状況を調べます.ここには二つのロックがあります.DMM操作ではロックが発生します.二つのDMMは今はcomitがないので、ロックを持っています.二つのセッションの待ち受けイベントを見るのがポイントです.前のsid=146が待っているのがSQL*Net message from clientです.実際には待機中です.sid=147が待っているのはenq:TX-row lock contentです.実はsid=146が持っているロック2つのsessionが持つロックは全部3-SX(Row-X)ラインでロックされています.select t t t 2.username       t 3.owner、       t 3.object_name       t 2.machine、       t 2.sid as sid、       t 2.serial嗳、       t 2.LAST_CALL_ET       t 2.program、       t 1.locked_モード  from v$locked_object t t t 1,v$session t 2,dba_object t 3 where t 1.session_id=t 2.sid   and t 1.OBJECT_ID=t 3.object_id order by t 2.logon_タイム  USERNAME OWNER    OBJE MACHINE                         SID    SERIALÜLAST_CALL_ET PRORAM    LOCKED_MODE------------------------------------------------------SCOTT    SCOTT    T    WORKGROUTP\PC-200492625       146          5          897 sqlplus.exe  3 SCOTT    SCOTT    T    WORKGROUTP\PC-200492625       147         12          894 s qlplus.exe  3
2行が選択されました
--指定IDの待ちイベントを一覧表示する前のsession sid=146はクライアント入力を待っていますが、実際にはcomitコマンドを待っています.sid=147はenq:TX-row lock contension select SID,EVENT from v$sessionwait where sid=147
SQL>select SID,EVENT from v$session_wait where sid=147
 SID EVENT---------------------------------------- 147 enq:TX-rowロックcontention
1行が選択されました
SQL>select SID,EVENT from v$session_wait where sid=146
 SID EVENT---------------------------------------- 146 SQL*Net message from client
1行が選択されました
--現在ロックされているsessionが実行しているsql文selectを確認します. /*+  NOの_MERGE(a)  NOの_MERGE(b)  NOの_MERGE(c)  */  a.username、  a.machine、  a.sid、a.serial璣、a.last_コールet「Seconds」、b.id 1、c.sql_text"SQL"from v$session a,v$lock b,v$sqltext c where a.username is not null and a.lockwait=b.kaddr and c.hashvalue=a.sql_hashvalue
USERNAME MACHINE                         SID    サイリル    セッション        ID 1 SQL--------------------------------------------------------------------------------SCOTT    WORKGROUTP\PC-200492625       147         12       3006     327724 insert into t values('N')
--session 1 comit後、session 2はSQL>insert into t values('N')を待たない.
1行が作成されました
3.sql*plusセッションに列の値をNとするレコードを挿入し、まずcommtではない.それからもう一つのsql*plusセッションにYという行列値の記録を挿入すると、両者は互いに影響しないことが分かります.session 1 SQL>insert into t values('N')
1行が作成されましたinsert後はmitではないです
--session 2 SQL>insert into t values('Y')
1行が作成されましたinsert後はmitではないです
--lockqingkを見ると、二つのセッションがロックを持っていることが分かりますが、二人の待ち時間は何ですか?select t t t 2.username、       t 3.owner、       t 3.object_name       t 2.machine、       t 2.sid as sid、       t 2.serial嗳、       t 2.LAST_CALL_ET       t 2.program  from v$locked_object t t t 1,v$session t 2,dba_object t 3 where t 1.session_id=t 2.sid   and t 1.OBJECT_ID=t 3.object_id order by t 2.logon_タイム  USERNAME OWNER    OBJE MACHINE                         SID    SERIALÜLAST_CALL_ET PROGARAM----------------------------------------------------SCOTT    SCOTT    T    WORKGROUTP\PC-200492625       147         12          114 sqlplus.exe SCOTT    SCOTT    T    WORKGROUTP\PC-200492625       146         23          108 sqlplus.exe
2行が選択されました
--待ちイベントを見ると、二つのセッションが空いています.SQL>select SID、EVENT from v$session_wait where sid=146
 SID EVENT---------------------------------------- 146 SQL*Net message from client
1行が選択されました
SQL>select SID,EVENT from v$session_wait where sid=147
 SID EVENT---------------------------------------- 147 SQL*Net message from client
1行が選択されました