色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

小議在Oracle中索引的使用

瀏覽:42日期:2023-11-19 18:59:21
索引是由Oracle維護(hù)的可選結(jié)構(gòu),為數(shù)據(jù)提供快速的訪問(wèn)。準(zhǔn)確地判定在什么地方需要使用索引是困難的,使用索引有利于調(diào)節(jié)檢索速度。 當(dāng)建立一個(gè)索引時(shí),必須指定用于跟蹤的表名以及一個(gè)或多個(gè)表列。一旦建立了索引,在用戶(hù)表中建立、更改和刪除數(shù)據(jù)庫(kù)時(shí), Oracle就自動(dòng)地維護(hù)索引。創(chuàng)建索引時(shí),下列準(zhǔn)則將幫助用戶(hù)做出決定:1) 索引應(yīng)該在SQL語(yǔ)句的'where'或'and'部分涉及的表列(也稱(chēng)謂詞)被建立。假如personnel表的'firstname'表列作為查詢(xún)結(jié)果顯示,而不是作為謂詞部分,則不論其值是什么,該表列不會(huì)被索引。2)用戶(hù)應(yīng)該索引具有一定范圍的表列,索引時(shí)有一個(gè)大致的原則:假如表中列的值占該表中行的2 0 %以?xún)?nèi),這個(gè)表列就可以作為候選索引表列。假設(shè)一個(gè)表有36 000行且表中一個(gè)表列的值平均分布(大約每12000行),那么該表列不適合于一個(gè)索引。然而,假如同一個(gè)表中的其他表列中列值的行在1 0 0 0~1 5 0 0之間(占3 %~4 % ),則該表列可用作索引。3)假如在S Q L語(yǔ)句謂詞中多個(gè)表列被一起連續(xù)引用,則應(yīng)該考慮將這些表列一起放在一個(gè)索引內(nèi), O r a c l e將維護(hù)單個(gè)表列的索引(建立在單一表列上)或復(fù)合索引(建立在多個(gè)表列上)。復(fù)合索引稱(chēng)并置索引。  1 主要害字的約束關(guān)系數(shù)據(jù)庫(kù)理論指出,在表中能唯一標(biāo)識(shí)表的每個(gè)數(shù)據(jù)行的一個(gè)或多個(gè)表列是對(duì)象的主要害字。由于數(shù)據(jù)字典中定義的主要害字能確保表中數(shù)據(jù)行之間的唯一性,因此,在O r a c l e 8 i數(shù)據(jù)庫(kù)中建立表索引要害字有助于應(yīng)用調(diào)節(jié)。另外,這也減輕了開(kāi)發(fā)者為了實(shí)現(xiàn)唯一性檢查,而需要各自編程的要求。提示使用主要害字索引條目比不使用主要害字索引檢索得快。假設(shè)表p e r s o n把它的i d表列作為主要害字,用下列代碼設(shè)置約束:alter table person add constraint person_pk primary key (id) using index storage (initial 1m next 1m pctincrease 0) tablespace prd_indexes ;處理下列S Q L語(yǔ)句時(shí):select last_name ,first_name ,salary from person where id = 289 ;在查找一個(gè)已確定的“ i d”表列值時(shí), O r a c l e將直接找到p e r s o n _ p k。假如其未找到正確的索引條目,O r a c l e知道該行不存在。主要害字索引具有下列兩個(gè)獨(dú)特之處:1.1因?yàn)樗饕俏ㄒ坏模?所以O(shè) r a c l e知道只有一個(gè)條目具有設(shè)定值。假如查找到了所期望的條目,則立即終止查找。1.2一旦碰到一個(gè)大于設(shè)定值的條目,索引的順序搜索可被終止;2 ORDER BY中用索引ORDER BY 子句只在兩種嚴(yán)格的條件下使用索引. ORDER BY中所有的列必須包含在相同的索引中并保持在索引中的排列順序. ORDER BY中所有的列必須定義為非空. WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列. 例如: 表DEPT包含以下列: DEPT_CODE PKNOT NULL DEPT_DESC NOT NULL DEPT_TYPE NULL 非唯一性的索引(DEPT_TYPE) 低效: (索引不被使用) SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE EXPLAIN PLAN: SORT ORDER BY TABLE Access FULL 高效: (使用索引) SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0 EXPLAIN PLAN: TABLE ACCESS BY ROWID ON EMP INDEX RANGE SCAN ON DEPT_IDX 3 避免改變索引列的類(lèi)型. 當(dāng)比較不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)時(shí), ORACLE自動(dòng)對(duì)列進(jìn)行簡(jiǎn)單的類(lèi)型轉(zhuǎn)換. 假設(shè) EMPNO是一個(gè)數(shù)值類(lèi)型的索引列. SELECT … FROM EMP WHERE EMPNO = ‘123' 實(shí)際上,經(jīng)過(guò)ORACLE類(lèi)型轉(zhuǎn)換, 語(yǔ)句轉(zhuǎn)化為: SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123') 幸運(yùn)的是,類(lèi)型轉(zhuǎn)換沒(méi)有發(fā)生在索引列上,索引的用途沒(méi)有被改變. 現(xiàn)在,假設(shè)EMP_TYPE是一個(gè)字符類(lèi)型的索引列. SELECT … FROM EMP WHERE EMP_TYPE = 123 這個(gè)語(yǔ)句被ORACLE轉(zhuǎn)換為: SELECT … FROM EMP WHERE TO_NUMBER(EMP_TYPE)=123 因?yàn)閮?nèi)部發(fā)生的類(lèi)型轉(zhuǎn)換, 這個(gè)索引將不會(huì)被用到! 為了避免ORACLE對(duì)你的SQL進(jìn)行隱式的類(lèi)型轉(zhuǎn)換, 最好把類(lèi)型轉(zhuǎn)換用顯式表現(xiàn)出來(lái). 注重當(dāng)字符和數(shù)值比較時(shí), ORACLE會(huì)優(yōu)先轉(zhuǎn)換數(shù)值類(lèi)型到字符類(lèi)型. 4 需要當(dāng)心的WHERE子句 某些SELECT 語(yǔ)句中的WHERE子句不使用索引. 這里有一些例子. 在下面的例子里, ‘!=' 將不使用索引. 記住, 索引只能告訴你什么存在于表中, 而不能告訴你什么不存在于表中. 不使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT !=0; 使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT >0; 下面的例子中, ‘'是字符連接函數(shù). 就象其他函數(shù)那樣, 停用了索引. 不使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAMEACCOUNT_TYPE='AMEXA'; 使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME = ‘AMEX' AND ACCOUNT_TYPE=' A'; 下面的例子中, ‘+'是數(shù)學(xué)函數(shù). 就象其他數(shù)學(xué)函數(shù)那樣, 停用了索引. 不使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT + 3000 >5000; 使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT > 2000 ; 下面的例子中,相同的索引列不能互相比較,這將會(huì)啟用全表掃描. 不使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME); 使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%'); 假如一定要對(duì)使用函數(shù)的列啟用索引, ORACLE新的功能: 基于函數(shù)的索引(Function-Based Index) 也許是一個(gè)較好的方案. CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函數(shù)的索引*/ SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL'; /*將使用索引*/ 5 怎樣監(jiān)控?zé)o用的索引Oracle 9i以上,可以監(jiān)控索引的使用情況,假如一段時(shí)間內(nèi)沒(méi)有使用的索引,一般就是無(wú)用的索引語(yǔ)法為:開(kāi)始監(jiān)控:alter index index_name monitoring usage;檢查使用狀態(tài):select * from v$object_usage;停止監(jiān)控:alter index index_name nomonitoring usage;當(dāng)然,假如想監(jiān)控整個(gè)用戶(hù)下的索引,可以采用如下的腳本:set heading offset echo offset feedback offset pages 10000spool start_index_monitor.sqlSELECT 'alter index 'owner'.'index_name' monitoring usage;'FROM dba_indexesWHERE owner = USER; spool off set heading onset echo onset feedback on------------------------------------------------set heading offset echo offset feedback offset pages 10000spool stop_index_monitor.sqlSELECT 'alter index 'owner'.'index_name' nomonitoring usage;'FROM dba_indexesWHERE owner = USER; spool off set heading onset echo onset feedback on
主站蜘蛛池模板: 亚洲乱码一二三四五六区 | 男人天堂亚洲 | 久久亚洲国产中v天仙www | 在线国产视频 | 韩国免费一级成人毛片 | 精品国产欧美一区二区五十路 | 亚洲免费网 | 美毛片| 国产成人丝袜网站在线看 | 欧美一区二区在线 | 国产资源精品一区二区免费 | 日韩欧美一区二区不卡看片 | 香港三级网站 | 国产一级特黄特色aa毛片 | 99爱免费观看视频在线 | 日韩欧美久久一区二区 | 一级毛片在线不卡直接观看 | 亚洲精品专区一区二区三区 | 成年人免费的视频 | 日本韩国欧美在线观看 | 韩国三级日本三级香港三级黄 | 国产一级aaa全黄毛片 | 97视频免费上传播放 | 精品国产综合区久久久久99 | 国产一区二区免费播放 | 久久免费视频7 | 亚洲国内精品 | 午夜精品久久久久久99热7777 | 亚洲国产欧美自拍 | 国产美女一区二区 | 久色视频在线 | 久久精品18| 中文国产成人精品久久久 | 91精品国产综合久久久久 | 一区二区三区不卡在线 | 亚洲一区二区免费视频 | 欧美高清性色生活 | 国产呦系列呦 | 国产一级一片免费播放视频 | 亚洲国产精品久久久久久网站 | 成年人免费黄色 |