oracle 五种索引创建
?http://database.51cto.com/art/201010/231388.htm
要在Oracle數(shù)據(jù)庫中使用索引,首先需要創(chuàng)建Oracle索引。下面就為您介紹創(chuàng)建Oracle索引的方法,希望對您能有所幫助。
適當(dāng)?shù)氖褂盟饕梢蕴岣邤?shù)據(jù)檢索速度,可以給經(jīng)常需要進行查詢的字段創(chuàng)建索引。oracle的索引分為5種:唯一索引,組合索引,反向鍵索引,位圖索引,基于函數(shù)的索引
創(chuàng)建Oracle索引的標準語法:
CREATE INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空間名;
創(chuàng)建唯一索引:
CREATE unique INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空間名;
創(chuàng)建組合索引:
CREATE INDEX 索引名 ON 表名 (列名1,列名2)
TABLESPACE 表空間名;
創(chuàng)建反向鍵索引:
CREATE INDEX 索引名 ON 表名 (列名) reverse
TABLESPACE 表空間名;
以上就是創(chuàng)建Oracle索引的方法介紹。
?
===
http://database.51cto.com/art/201010/231096.htm
使用Oracle函數(shù)索引,無疑是提高查詢效率的有效方法之一。下面就為您詳細介紹Oracle函數(shù)索引的使用方法,希望對您能有所幫助。
談到任何對列的操作都可能導(dǎo)致全表掃描,例如:
但是這種查詢在客服系統(tǒng)又經(jīng)常使用,我們可以創(chuàng)建一個帶有substr函數(shù)的基于Oracle函數(shù)索引,
但是這種查詢在客服系統(tǒng)又經(jīng)常使用,我們可以創(chuàng)建一個帶有substr函數(shù)的Oracle函數(shù)索引,
這樣在執(zhí)行上面的查詢語句時,這個基于函數(shù)的索引將排上用場,執(zhí)行計劃將是(INDEX RANGE SCAN)。
上面的例子中,我們創(chuàng)建了基于函數(shù)的索引,但是如果執(zhí)行下面的查詢:
得到的執(zhí)行計劃將還是(TABLE ACCESS FULL),因為只有當(dāng)數(shù)據(jù)列能夠等式匹配時,基于函數(shù)的索引才能生效,這樣對于這種索引的計劃和維護的要求都很高。請注意,向表中添加索引是非常危險的操作,因為這將導(dǎo)致許多查詢執(zhí)行計劃的變更。然而,如果我們使用基于函數(shù)的索引就不會產(chǎn)生這樣的問題,因為Oracle只有在查詢使用了匹配的內(nèi)置函數(shù)時才會使用這種類型的索引。
===
http://space.itpub.net/21805468/viewspace-618068
oracle之位圖索引
上一篇 / 下一篇 ?2009-11-03 23:09:11 / 個人分類:oracle
查看( 458 ) / 評論( 2 ) / 評分( 10 / 0 )位圖索引適用于低基數(shù)(low-cardinality)列,所謂低基數(shù)列就是指這個列只有很少的可取值。
位圖索引的問題:
采用位圖索引,一個鍵指向多行,可能數(shù)以百計甚至更多。如果更新一個位圖索引鍵,那么這
個鍵指向的數(shù)百條記錄會與你實際更新的那一行一同被有效地鎖定。
位圖索引的適用場景:
位圖索引是針對那些值不經(jīng)常改變的字段的,在實際應(yīng)用中,如果某個字段的值需要頻繁更新,
那么就不適合在它上面創(chuàng)建位圖索引。
以下為針對位圖索引的實驗:
1.準備環(huán)節(jié):
--創(chuàng)建一個表t
SQL> create table t(processed_flag varchar2(1));
表已創(chuàng)建。
--在表t的processed_flag創(chuàng)建一個位圖索引
SQL> create bitmap index t_idx on t(processed_flag);
索引已創(chuàng)建。
2.在一個sql*plus會話中插入一行列值為N的記錄,且先不commit;然后在另一個sql*plus會話中也
插入一行列值為N的記錄,這時發(fā)現(xiàn)后面的會話會被阻塞。
--session1
SQL> insert into t values('N');
已創(chuàng)建 1 行。
insert后不提交,則位圖索引中的N鍵被鎖住,任何DML語句只要與N有關(guān)都被阻塞
--session2
SQL> insert into t values('N');
該語句被掛起
--查詢lock情況
這里有兩個鎖是正常的,因為任何DML操作都會產(chǎn)生鎖,因為兩個DML現(xiàn)在都沒有commit,所以都會持有鎖。
關(guān)鍵是看兩個session的等待事件。可以看到前面的sid=146等待的是SQL*Net message from client,實際是
處于空閑等待,而sid=147等待的是enq: TX - row lock contention,其實是在等待sid=146釋放其持有的鎖
兩個session持有的鎖都為3-SX(Row-X)行級排它鎖。
select t2.username,
?????? t3.owner,
?????? t3.object_name,
?????? t2.machine,
?????? t2.sid as sid,
?????? t2.serial#,
?????? t2.LAST_CALL_ET,
?????? t2.program,
?????? t1.locked_mode
? from v$locked_object t1, v$session t2, dba_objects t3
?where t1.session_id = t2.sid
?? and t1.OBJECT_ID = t3.object_id
?order by t2.logon_time;
?
USERNAME OWNER??? OBJE MACHINE???????????????????????? SID??? SERIAL# LAST_CALL_ET PROGRAM????LOCKED_MODE
-------- -------- ---- ------------------------------ ---- ---------- ------------ -------------- ------------
SCOTT??? SCOTT??? T??? WORKGROUP\PC-200904261625?????? 146????????? 5????????? 897 sqlplus.exe??3
SCOTT??? SCOTT??? T??? WORKGROUP\PC-200904261625?????? 147???????? 12????????? 894 sqlplus.exe??3
已選擇2行。
--列出指定 ID 的等待事件
可見前面的session sid=146在等待客戶端輸入,實際上就是等待commit命令,而sid=147則是在等待enq: TX - row lock contention
select SID,EVENT from v$session_wait where sid=147;
SQL> select SID,EVENT from v$session_wait where sid=147;
?SID EVENT
---- ----------------------------------------------------------------
?147 enq: TX - row lock contention
已選擇 1 行。
SQL> select SID,EVENT from v$session_wait where sid=146;
?SID EVENT
---- ----------------------------------------------------------------
?146 SQL*Net message from client
已選擇 1 行。
--查看當(dāng)前被鎖的 session 正在執(zhí)行的 sql 語句
select? /*+? NO_MERGE(a)? NO_MERGE(b)? NO_MERGE(c)? */? a.username,? a.machine,? a.sid,
a.serial#, a.last_call_et "Seconds", b.id1, 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.hash_value =a.sql_hash_value
USERNAME MACHINE???????????????????????? SID??? SERIAL#??? Seconds??????? ID1 SQL
-------- ------------------------------ ---- ---------- ---------- ---------- ----------------------
SCOTT??? WORKGROUP\PC-200904261625?????? 147???????? 12?????? 3006???? 327724 insert into t values('N')
--session1 commit后,session2不再等待
SQL> insert into t values('N');
已創(chuàng)建 1 行。
3.在一個sql*plus會話中插入一行列值為N的記錄,且先不commit;然后在另一個sql*plus會話中
插入一行列值為Y的記錄,這時發(fā)現(xiàn)二者互不影響。
--session1
SQL> insert into t values('N');
已創(chuàng)建 1 行。
insert后不commit
--session2
SQL> insert into t values('Y');
已創(chuàng)建 1 行。
insert后不commit
--查看lockqingk
可見兩個session都持有鎖,那么二者的等待事件是什么呢
select t2.username,
?????? t3.owner,
?????? t3.object_name,
?????? t2.machine,
?????? t2.sid as sid,
?????? t2.serial#,
?????? t2.LAST_CALL_ET,
?????? t2.program
? from v$locked_object t1, v$session t2, dba_objects t3
?where t1.session_id = t2.sid
?? and t1.OBJECT_ID = t3.object_id
?order by t2.logon_time;
?
USERNAME OWNER??? OBJE MACHINE???????????????????????? SID??? SERIAL# LAST_CALL_ET PROGRAM
-------- -------- ---- ------------------------------ ---- ---------- ------------ --------------
SCOTT??? SCOTT??? T??? WORKGROUP\PC-200904261625?????? 147???????? 12????????? 114 sqlplus.exe
SCOTT??? SCOTT??? T??? WORKGROUP\PC-200904261625?????? 146???????? 23????????? 108 sqlplus.exe
已選擇2行。
--查看等待事件
可見兩個session都處于空閑等待
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 行。
?
?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的oracle 五种索引创建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索引的物理结构
- 下一篇: racle B-Tree和Bitmap索