亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

為什么有時Oracle數據庫不用索引來查找數據?

2024-08-29 13:46:28
字體:
來源:轉載
供稿:網友
   當你運用SQL語言,向數據庫發布一條查詢語句時,Oracle將伴隨產生一個“執行計劃”,也就是該語句將通過何種數據搜索方案執行,是通過全表掃描、還是通過索引搜尋等其它方式。搜索方案的選用與ORACLE的優化器息息相關。
  SQL語句的執行步驟

  一條SQL語句的處理過程要經過以下幾個步驟。

  1 語法分析 分析語句的語法是否符合規范,衡量語句中各表達式的意義。

  2 語義分析 檢查語句中涉及的所有數據庫對象是否存在,且用戶有相應的權限。

  3 視圖轉換 將涉及視圖的查詢語句轉換為相應的對基表查詢語句。

  4 表達式轉換 將復雜的SQL表達式轉換為較簡單的等效連接表達式。

  5 選擇優化器 不同的優化器一般產生不同的“執行計劃”

  6 選擇連接方式 ORACLE有三種連接方式,對多表連接ORACLE可選擇適當的連接方式。

  7 選擇連接順序 對多表連接ORACLE選擇哪一對表先連接,選擇這兩表中哪個表做為源數據表。

  8 選擇數據的搜索路徑 根據以上條件選擇合適的數據搜索路徑,如是選用全表搜索還是利用索引或是其他的方式。

  9 運行“執行計劃”

  ORACLE的優化器

  ORACLE有兩種優化器:基于規則的優化器(RBO, Rule Based Optimizer),和基于代價的優化器(CBO, Cost Based Optimizer)。

  RBO自ORACLE 6版以來被采用,有著一套嚴格的使用規則,只要你按照它去寫SQL語句,無論數據表中的內容怎樣,也不會影響到你的“執行計劃”,也就是說對數據不“敏感”,ORACLE公司已經不再發展這種技術了。 CBO自ORACLE 7版被引入,ORACLE自7版以來采用的許多新技術都是基于CBO的,如星型連接排列查詢,哈希連接查詢,和并行查詢等。CBO計算各種可能“執行計劃”的“代價”,即cost,從中選用cost最低的方案,作為實際運行方案。 各“執行計劃”的cost的計算根據,依靠于數據表中數據的統計分布,ORACLE數據庫本身對該統計分布并不清楚,須要分析表和相關的索引,才能搜集到CBO所需的數據。

  一般而言,CBO所選擇的“執行計劃”都不會比RBO的“執行計劃”差,而且相對而言,CBO對程序員的要求沒有RBO那么苛刻,節省了程序員為了從多個可能的“執行計劃”中選擇一個最優的方案而花費的調試時間,但在某些場合下也會存在問題。

  較典型的問題有:有時,表明明建有索引,但查詢過程顯然沒有用到相關的索引,導致查詢過程耗時漫長,占用資源巨大,問題到底出在哪兒呢?按照以下順序查找,基本上能發現原因所在。

  查找原因的步驟

  首先,我們要確定數據庫運行在何種優化模式下,相應的參數是:optimizer_mode。可在svrmgrl中運行“show parameter optimizer_mode"來查看。ORACLE V7以來缺省的設置應是"choose",即假如對已分析的表查詢的話選擇CBO,否則選擇RBO。假如該參數設為“rule”,則不論表是否分析過,一概選用RBO,除非在語句中用hint強制。

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

  第三,看采用了哪種類型的連接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。在兩張表連接,且內表的目標列上建有索引時,只有Nested Loop才能有效地利用到該索引。SMJ即使相關列上建有索引,最多只能因索引的存在,避免數據排序過程。HJ由于須做HASH運算,索引的存在對數據查詢速度幾乎沒有影響。

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

  第五,是否用到系統數據字典表或視圖。由于系統數據字典表都未被分析過,可能導致極差的“執行計劃”。但是不要擅自對數據字典表做分析,否則可能導致死鎖,或系統性能下降。 第六,索引列是否函數的參數。如是,索引在查詢時用不上。

  第七,是否存在潛在的數據類型轉換。如將字符型數據與數值型數據比較,ORACLE會自動將字符型用to_number()函數進行轉換,從而導致第六種現象的發生。

  第八,是否為表和相關的索引搜集足夠的統計數據。對數據經常有增、刪、改的表最好定期對表和索引進行分析,可用SQL語句“analyze table xxxx compute statistics for all indexes;"。ORACLE把握了充分反映實際的統計數據,才有可能做出正確的選擇。

  第九,索引列的選擇性不高。

  我們假設典型情況,有表emp,共有一百萬行數據,但其中的emp.deptno列,數據只有4種不同的值,如10、20、30、40。雖然emp數據行有很多,ORACLE缺省認定表中列的值是在所有數據行均勻分布的,也就是說每種deptno值各有25萬數據行與之對應。假設SQL搜索條件DEPTNO=10,利用deptno列上的索引進行數據搜索效率,往往不比全表掃描的高,ORACLE理所當然對索引“視而不見”,認為該索引的選擇性不高。

  但我們考慮另一種情況,假如一百萬數據行實際不是在4種deptno值間平均分配,其中有99萬行對應著值10,5000行對應值20,3000行對應值30,2000行對應值40。在這種數據分布圖案中對除值為10外的其它deptno值搜索時,毫無疑問,假如索引能被應用,那么效率會高出很多。我們可以采用對該索引列進行單獨分析,或用analyze語句對該列建立直方圖,對該列搜集足夠的統計數據,使ORACLE在搜索選擇性較高的值能用上索引。

  第十,索引列值是否可為空(NULL)。假如索引列值可以是空值,在SQL語句中那些需要返回NULL值的操作,將不會用到索引,如COUNT(*),而是用全表掃描。這是因為索引中存儲值不能為全空。

  第十一,看是否有用到并行查詢(PQO)。并行查詢將不會用到索引。

  第十二,看PL/SQL語句中是否有用到bind變量。由于數據庫不知道bind變量具體是什么值,在做非相等連接時,如“<”,“>”,“like”等。ORACLE將引用缺省值,在某些情況下會對執行計劃造成影響。

  假如從以上幾個方面都查不出原因的話,我們只好用采用在語句中加hint的方式強制ORACLE使用最優的“執行計劃”。

  hint采用注釋的方式,有行注釋和段注釋兩種方式。
如我們想要用到A表的IND_COL1索引的話,可采用以下方式:

“SELECT /*+ INDEX(A IND_COL1)*/ * FROM A WHERE COL1 = XXX;"
  注重,注釋符必須跟在SELECT之后,且注釋中的“+”要緊跟著注釋起始符“/*”或“--”,否則hint就被認為是一般注釋,對PL/SQL語句的執行不產生任何影響。

  兩種有效的跟蹤調試方法

  ORACLE提供了兩種有效的工具來跟蹤調試PL/SQL語句的執行計劃。

  一種是EXPLAIN TABLE方式。用戶必須首先在自己的模式(SCHEMA)下,建立PLAN_TABLE表,執行計劃的每一步驟都將記錄在該表中,建表SQL腳本為在${ORACLE_HOME}/rdbms/admin/下的utlxplan.sql。

  打開SQL*PLUS,輸入“SET AUTOTRACE ON”,然后運行待調試的SQL語句。在給出查詢結果后,ORACLE將顯示相應的“執行計劃”,包括優化器類型、執行代價、連接方式、連接順序、數據搜索路徑以及相應的連續讀、物理讀等資源代價。

  假如我們不能確定需要跟蹤的具體SQL語句,比如某個應用使用一段時間后,響應速度忽然變慢。我們這時可以利用ORACLE提供的另一個有力工具TKPROF,對應用的執行過程全程跟蹤。

  我們要先在系統視圖V$session中,可根據USERID或MACHINE,查出相應的SID和SERIAL#。

  以SYS或其他有執行DBMS_SYSTEM程序包的用戶連接數據庫,執行“EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,TRUE);”。

  然后運行應用程序,這時在服務器端,數據庫參數“USER_DUMP_DEST”指示的目錄下,會生成ora__xxxx.trc文件,其中xxxx為被跟蹤應用的操作系統進程號。

  應用程序執行完成后,用命令tkprof對該文件進行分析。命令示例:“tkprof tracefile outputfile explain=userid/passWord"。在操作系統ORACLE用戶下,鍵入“tkprof”,會有具體的命令幫助。分析后的輸出文件outputfile中,有每一條PL/SQL語句的“執行計劃”、CPU占用、物理讀次數、邏輯讀次數、執行時長等重要信息。根據輸出文件的信息,我們可以很快發現應用中哪條PL/SQL語句是問題的癥結所在。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区玩具在线观看| 日韩中文字幕免费| 国产在线999| 亚洲小视频在线观看| 97在线视频免费观看| 欧美电影免费观看电视剧大全| 蜜月aⅴ免费一区二区三区| 91干在线观看| 久久精品视频一| 日韩黄在线观看| 久久久久久噜噜噜久久久精品| 欧美巨乳美女视频| 美女啪啪无遮挡免费久久网站| 午夜精品久久久久久久99热浪潮| 亚洲精品ady| 国产精品美女午夜av| 国产成人精品国内自产拍免费看| 亚洲国产精品99久久| 国产在线视频欧美| 色综合久久久888| 影音先锋日韩有码| 日韩av在线免费看| 日韩久久精品成人| 亚洲性线免费观看视频成熟| 国产精品免费久久久| 国产在线观看91精品一区| 欧洲美女7788成人免费视频| 日韩av在线网址| 亚洲欧美成人网| 亚洲精品少妇网址| 在线观看中文字幕亚洲| 欧美性受xxxx白人性爽| 日韩欧中文字幕| 欧美成人午夜影院| 国产久一一精品| 国产99视频精品免视看7| 日韩精品在线视频| 欧美激情一区二区久久久| 欧美视频在线观看 亚洲欧| 国产精品久久久久av| 亚洲自拍中文字幕| 欧美激情免费观看| 欧美在线欧美在线| 97在线观看免费| 欧美日韩一区二区免费视频| 亚洲国产精品免费| 日韩电影中文字幕在线| 丰满岳妇乱一区二区三区| 欧美在线视频a| 欧美日本中文字幕| 日韩美女毛茸茸| 亚洲伊人成综合成人网| 国产精品电影一区| 色樱桃影院亚洲精品影院| 亚洲欧美国产一区二区三区| 国产高清视频一区三区| 国产精品三级网站| 欧美一级在线亚洲天堂| 欧美重口另类videos人妖| www.精品av.com| 精品电影在线观看| 欧美一区二区三区免费观看| 亚洲视频777| 久久久精品亚洲| 国产欧美精品在线播放| 91精品国产自产在线老师啪| 欧美成人黄色小视频| 热久久免费国产视频| 91国产精品91| 亚洲人成网在线播放| 国产99视频在线观看| 亚洲美女福利视频网站| 俺去亚洲欧洲欧美日韩| 日韩精品免费在线视频| 欧美精品video| 欧美一级黑人aaaaaaa做受| 亚洲欧美中文日韩在线| 中文字幕久精品免费视频| 国产精品wwwwww| 欧美成人精品在线| 日韩av不卡在线| 亚洲综合中文字幕在线观看| 欧美亚洲第一页| 日韩**中文字幕毛片| 在线激情影院一区| 亚洲欧美制服第一页| 亚洲图中文字幕| 日本不卡免费高清视频| 国产一区二区三区视频免费| 欧美激情在线一区| 日韩视频欧美视频| 92福利视频午夜1000合集在线观看| 国产精品成人va在线观看| 国产精品视频免费在线| 欧美大尺度激情区在线播放| 欧美裸体xxxx极品少妇软件| 日韩av大片免费看| 久久精品男人天堂| 亚洲色图美腿丝袜| 国产精品中文久久久久久久| 国产一区二区三区在线| 色综合影院在线| 日韩av在线播放资源| 亚洲精品99久久久久| 国产精品第3页| 欧美中文字幕第一页| 91久久嫩草影院一区二区| 亚洲精选中文字幕| 国产精品国产三级国产专播精品人| 国产精品电影观看| 欧美日韩中文在线观看| 在线日韩中文字幕| 欧美福利视频在线观看| 色综合久久天天综线观看| 欧美精品手机在线| 77777少妇光屁股久久一区| 亚洲天堂成人在线视频| 国产成人一区二区三区电影| 亚洲欧美在线磁力| 精品亚洲一区二区三区四区五区| 日韩欧美在线免费观看| 欧美专区日韩视频| 一区二区中文字幕| 日韩精品极品毛片系列视频| 成人乱人伦精品视频在线观看| 国产一区二区黑人欧美xxxx| 国产成人激情视频| 欧美日韩福利视频| 日韩精品免费在线视频观看| 97精品国产91久久久久久| 国产精品男女猛烈高潮激情| 色无极亚洲影院| 欧美在线视频免费| 亚洲一区精品电影| 久久久久久综合网天天| 日韩电影在线观看永久视频免费网站| 91精品啪aⅴ在线观看国产| 欧美性生交大片免费| 欧美日韩国产精品一区二区不卡中文| 国产欧美久久一区二区| 久久中国妇女中文字幕| 国产精品成人av性教育| 久久久999国产| 色综合老司机第九色激情| 欧美一区二区三区精品电影| 亚洲欧美国内爽妇网| 7m第一福利500精品视频| 亚洲欧美精品一区二区| 黑人精品xxx一区一二区| 欧美性一区二区三区| 91色视频在线观看| 欧美精品一区在线播放| 成人亲热视频网站| 精品无人区乱码1区2区3区在线| 日韩精品视频在线播放| 欧美日本黄视频| 欧美成人精品在线视频| 成人美女免费网站视频| 日韩电影在线观看永久视频免费网站| 欧美国产第二页| 久久精品91久久香蕉加勒比| 国产精品视频1区| 九九热在线精品视频| 亚洲跨种族黑人xxx|