佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > oracle 索引不能使用深入解析

oracle 索引不能使用深入解析

熱門標(biāo)簽:呼叫中心市場需求 服務(wù)外包 AI電銷 百度競價排名 地方門戶網(wǎng)站 Linux服務(wù)器 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng)
較典型的問題有:有時,表明明建有索引,但查詢過程顯然沒有用到相關(guān)的索引,導(dǎo)致查詢過程耗時漫長,占用資源巨大,問題到底出在哪兒呢?按照以下順序查找,基本上能發(fā)現(xiàn)原因所在。

查找原因的步驟
首先,我們要確定數(shù)據(jù)庫運(yùn)行在何種優(yōu)化模式下,相應(yīng)的參數(shù)是:optimizer_mode??稍趕vrmgrl中運(yùn)行“showparameteroptimizer_mode"來查看。ORACLEV7以來缺省的設(shè)置應(yīng)是"choose",即如果對已分析的表查詢的話選擇CBO,否則選擇RBO。如果該參數(shù)設(shè)為“rule”,則不論表是否分析過,一
概選用RBO,除非在語句中用hint強(qiáng)制。

其次,檢查被索引的列或組合索引的首列是否出現(xiàn)在PL/SQL語句的WHERE子句中,這是“執(zhí)行計(jì)劃”能
用到相關(guān)索引的必要條件。

第三,看采用了哪種類型的連接方式。ORACLE的共有SortMergeJoin(SMJ)、HashJoin(HJ)和NestedLoopJoin(NL)。在兩張表連接,且內(nèi)表的目標(biāo)列上建有索引時,只有NestedLoop才能有效地利用到該索引。SMJ即使相關(guān)列上建有索引,最多只能因索引的存在,避免數(shù)據(jù)排序過程。HJ由于須做HASH運(yùn)算,索引的存在對數(shù)據(jù)查詢速度幾乎沒有影響。

第四,看連接順序是否允許使用相關(guān)索引。假設(shè)表emp的deptno列上有索引,表dept的列deptno上無索引,WHERE語句有emp.deptno=dept.deptno條件。在做NL連接時,emp做為外表,先被訪問,由于連接機(jī)制原因,外表的數(shù)據(jù)訪問方式是全表掃描,emp.deptno上的索引顯然是用不上,最多在其上
做索引全掃描或索引快速全掃描。

第五,是否用到系統(tǒng)數(shù)據(jù)字典表或視圖。由于系統(tǒng)數(shù)據(jù)字典表都未被分析過,可能導(dǎo)致極差的“執(zhí)行計(jì)劃”。但是不要擅自對數(shù)據(jù)字典表做分析,否則可能導(dǎo)致死鎖,或系統(tǒng)性能下降。

第六,是否存在潛在的數(shù)據(jù)類型轉(zhuǎn)換。如將字符型數(shù)據(jù)與數(shù)值型數(shù)據(jù)比較,ORACLE會自動將字符型用to_number()函數(shù)進(jìn)行轉(zhuǎn)換,從而導(dǎo)致第六種現(xiàn)象的發(fā)生。

第七,是否為表和相關(guān)的索引搜集足夠的統(tǒng)計(jì)數(shù)據(jù)。對數(shù)據(jù)經(jīng)常有增、刪、改的表最好定期對表和索引進(jìn)行分析,可用SQL語句“analyzetablexxxxcomputestatisticsforallindexes;"。ORACLE掌握了充分反映實(shí)際的統(tǒng)計(jì)數(shù)據(jù),才有可能做出正確的選擇。

第八,索引列的選擇性不高。我們假設(shè)典型情況,有表emp,共有一百萬行數(shù)據(jù),但其中的emp.deptno列,數(shù)據(jù)只有4種不同的值,如10、20、30、40。雖然emp數(shù)據(jù)行有很多,ORACLE缺省認(rèn)定表中列的值是在所有數(shù)據(jù)行均勻分布的,也就是說每種deptno值各有25萬數(shù)據(jù)行與之對應(yīng)。假設(shè)SQL搜索條件DEPTNO=10,利用deptno列上的索引進(jìn)行數(shù)據(jù)搜索效率,往往不比全表掃描的高,ORACLE理所當(dāng)然對索引“視而不見”,認(rèn)為該索引的選擇性不高。但我們考慮另一種情況,如果一百萬數(shù)據(jù)行實(shí)際不是在4種deptno值間平均分配,其中有99萬行對應(yīng)著值10,5000行對應(yīng)值20,3000行對應(yīng)值30,2000行對應(yīng)值40。在這種數(shù)據(jù)分布圖案中對除值為10外的其它deptno值搜索時,毫無疑問,如果索引能被應(yīng)用,那么效率會高出很多。我們可以采用對該索引列進(jìn)行單獨(dú)分析,或用analyze語句對該列建立直方圖,對該列搜集足夠的統(tǒng)計(jì)數(shù)據(jù),使ORACLE在搜索選擇性較高的值能用上索引。

第九,索引列值是否可為空(NULL)。如果索引列值可以是空值,在SQL語句中那些需要返回NULL值的操作,將不會用到索引,如COUNT(*),而是用全表掃描。這是因?yàn)樗饕写鎯χ挡荒転槿铡?

第十一,看是否有用到并行查詢(PQO)。并行查詢將不會用到索引。如我們想要用到A表的IND_COL1索引的話,可采用以下方式:“SELECT/*+INDEX(AIND_COL1)*/*FROMAWHERECOL1=XXX;"注意,注釋符必須跟在SELECT之后,且注釋中的“+”要緊跟著注釋起始符“/*”或“--”,否則hint就被認(rèn)為是一般注釋,對PL/SQL語句的執(zhí)行不產(chǎn)生任何影響。一種是EXPLAINTABLE方式。用戶必須首先在自己的模式(SCHEMA)下,建立PLAN_TABLE表,執(zhí)行計(jì)劃的每一步驟都將記錄在該表中,建表SQL腳本為在${ORACLE_HOME}/rdbms/admin/下的utlxplan.sql
。

打開SQL*PLUS,輸入“SETAUTOTRACEON”,然后運(yùn)行待調(diào)試的SQL語句。在給出查詢結(jié)果后,ORACLE將顯示相應(yīng)的“執(zhí)行計(jì)劃”,包括優(yōu)化器類型、執(zhí)行代價、連接方式、連接順序、數(shù)據(jù)搜索路徑以
及相應(yīng)的連續(xù)讀、物理讀等資源代價。如果我們不能確定需要跟蹤的具體SQL語句,比如某個應(yīng)用使用一段時間后,響應(yīng)速度忽然變慢。我們這
時可以利用ORACLE提供的另一個有力工具TKPROF,對應(yīng)用的執(zhí)行過程全程跟蹤。

我們要先在系統(tǒng)視圖V$SESSION中,可根據(jù)USERID或MACHINE,查出相應(yīng)的SID和SERIAL#。以SYS或其他有執(zhí)行DBMS_SYSTEM程序包的用戶連接數(shù)據(jù)庫,執(zhí)行“EXECUTE
DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,TRUE);”。然后運(yùn)行應(yīng)用程序,這時在服務(wù)器端,數(shù)據(jù)庫參數(shù)“USER_DUMP_DEST”指示的目錄下,會生成ora__xxxx.trc文件,其中xxxx為被跟蹤應(yīng)用的操作系統(tǒng)進(jìn)程號。

應(yīng)用程序執(zhí)行完成后,用命令tkprof對該文件進(jìn)行分析。命令示例:“tkproftracefileoutputfileexplain=userid/password"。在操作系統(tǒng)ORACLE用戶下,鍵入“tkprof”,會有詳細(xì)的命令幫助。分析后的輸出文件outputfile中,有每一條PL/SQL語句的“執(zhí)行計(jì)劃”、CPU占用、物理讀次數(shù)、邏輯讀次數(shù)、執(zhí)行時長等重要信息。根據(jù)輸出文件的信息,我們可以很快發(fā)現(xiàn)應(yīng)用中哪條PL/SQL語句是問題的癥結(jié)所在.
您可能感興趣的文章:
  • Oracle數(shù)據(jù)庫中建立索引的基本方法講解
  • Oracle輕松取得建表和索引的DDL語句
  • Oracle中如何把表和索引放在不同的表空間里
  • oracle索引介紹(圖文詳解)
  • Oracle關(guān)于重建索引爭論的總結(jié)
  • Oracle使用強(qiáng)制索引的方法與注意事項(xiàng)
  • Oracle索引(B*tree與Bitmap)的學(xué)習(xí)總結(jié)
  • Oracle 如何創(chuàng)建和使用全文索引
  • Oracle Index索引無效的原因與解決方法
  • oracle索引的測試實(shí)例代碼

標(biāo)簽:銅川 衡水 湖南 崇左 湘潭 仙桃 蘭州 黃山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《oracle 索引不能使用深入解析》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    阿巴嘎旗| 健康| 邢台县| 栾川县| 雷波县| 高青县| 长丰县| 小金县| 满洲里市| 凤山市| 抚宁县| 赤壁市| 象山县| 贺州市| 屏东市| 高淳县| 新巴尔虎左旗| 马龙县| 治多县| 沽源县| 太谷县| 西藏| 水城县| 鄄城县| 高密市| 饶阳县| 香港 | 宁德市| 兴宁市| 安远县| 剑川县| 远安县| 南安市| 武乡县| 临沭县| 玛纳斯县| 类乌齐县| 家居| 石林| 尚义县| 隆尧县|