日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 五种索引创建

發(fā)布時間:2024/4/17 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 五种索引创建 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?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)致全表掃描,例如:

  • select?*?from?emp?where?substr(ename,1,2)=’SM’;?
  • 但是這種查詢在客服系統(tǒng)又經(jīng)常使用,我們可以創(chuàng)建一個帶有substr函數(shù)的基于Oracle函數(shù)索引,

  • create?index?emp_ename_substr?on?eemp?(?substr(ename,1,2)?);?
  • 但是這種查詢在客服系統(tǒng)又經(jīng)常使用,我們可以創(chuàng)建一個帶有substr函數(shù)的Oracle函數(shù)索引,

  • create?index?emp_ename_substr?on?eemp?(?substr(ename,1,2)?);?
  • 這樣在執(zhí)行上面的查詢語句時,這個基于函數(shù)的索引將排上用場,執(zhí)行計劃將是(INDEX RANGE SCAN)。
    上面的例子中,我們創(chuàng)建了基于函數(shù)的索引,但是如果執(zhí)行下面的查詢:

  • select?*?from?emp?where?substr(ename,1,1)=’S’?
  • 得到的執(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。