自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Oracle數(shù)據(jù)庫不能使用索引的原因定位

數(shù)據(jù)庫 Oracle
本文我們主要介紹了Oracle數(shù)據(jù)庫不能使用索引的原因定位過程,以幫助我們迅速地找出原因所在,希望能夠?qū)δ兴鶐椭?/div>

Oracle數(shù)據(jù)庫有時候出現(xiàn)不能使用索引的現(xiàn)象,出現(xiàn)該現(xiàn)象的原因有很多,該怎么去定位呢?本文我們主要就介紹這一部分內(nèi)容。

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

其次,檢查被索引的列或組合索引的首列是否出現(xiàn)在 PL/SQL 語句的 WHERE 子句中,這是“執(zhí)行計劃”能。

第三,看采用了哪種類型的連接方式。 ORACLE 的共有 Sort Merge Join ( SMJ )、 Hash Join ( HJ )和 Nested Loop Join ( NL )。在兩張表連接,且內(nèi)表的目標(biāo)列上建有索引時,只有 Nested Loop 才能有效地利用到該索引。 SMJ 即使相關(guān)列上建有索引,最多只能因索引的存在,避免數(shù)據(jù)排序過程。 HJ 由于須做 HASH 運算,索引的存在對數(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í)行計劃。

第六,是否存在潛在的數(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)計數(shù)據(jù)。對數(shù)據(jù)經(jīng)常有增、刪、改的表***定期對表和索引進(jìn)行分析,可用 SQL 語句“ analyze table xxxx compute statistics for all indexes;" 。 ORACLE 掌。

第八,索引列的選擇性不高。 我們假設(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 理不是在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)行單獨分析,或用 analyze 語句對該列建立直方圖,對該列搜集足夠的統(tǒng)計數(shù)據(jù),使 ORACLE 在搜索選擇性較高的值能用上索引。

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

第十,看是否有用到并行查詢( PQO )。并行查詢將不會用到索引。如我們想要用到A 表的IND_COL1 “ SELECT /*+ INDEX ( A IND_COL1 ) */ * FROM A WHERE COL1 = XXX;"注意,注釋符必須跟在SELECT之后,且注釋中的“ + ”要緊跟著注釋起始符“ /* ”或“ -- ”,否則 hint 就被認(rèn)為是一般注釋,對 PL/SQL 語句的執(zhí)行不產(chǎn)生任何影響。
一種是 EXPLAIN TABLE 方式。

用戶必須首先在自己的模式( SCHEMA )下,建立 PLAN_TABLE 表,執(zhí)行計劃的每一步驟都將記錄在該表中,建表 SQL 腳本為在 ${ORACLE_HOME}/rdbms/admin/ 下的 utlxplan.sql 打開 SQL*PLUS ,輸入“ SET AUTOTRACE ON ”,然后運行待調(diào)試的 SQL 語句。在給出查詢結(jié)果后, ORACLE 將顯示相應(yīng)的“執(zhí)行計劃”,包括優(yōu)化器類型、執(zhí)行代價、連接方式、連接順序、數(shù)據(jù)搜索路徑以如果我們不能確定需要跟蹤的具體 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īng)用程序,這時在服務(wù)器端,數(shù)據(jù)庫參“ USER_DUMP_DEST ”指示的目錄下,會生成 ora__xxxx.trc 文件,其中 xxxx 為被跟蹤應(yīng)用的操作系統(tǒng)進(jìn)程號。應(yīng)用程序執(zhí)行完成后,用命令 tkprof 對該文件進(jìn)行分析。

命令示例:“ tkprof tracefile outputfile explain=userid/password" 。在操作系統(tǒng) ORACLE 用戶下,鍵入“ tkprof ”,會有詳細(xì)的命令幫助。分析后的輸出文件 outputfile 中,有每一條 PL/SQL 語句的“執(zhí)行計劃”、 CPU 占用、物理讀次數(shù)、邏輯讀次數(shù)、執(zhí)行時長等重要信息。根據(jù)輸出文件的信息,我們可以很快發(fā)現(xiàn)應(yīng)用中哪條 PL/SQL 語句是問題的癥結(jié)所在。

關(guān)于Oracle數(shù)據(jù)庫不能使用索引的原因定位就介紹到這里了,希望本次的介紹能夠?qū)δ兴鶐椭?/p>

【編輯推薦】

  1. 關(guān)于數(shù)據(jù)庫查詢性能調(diào)優(yōu)和索引優(yōu)化的總結(jié)
  2. 如何查看和修改Oracle數(shù)據(jù)庫服務(wù)器端的字符集
  3. CASE語句在Oracle中重新給指定字段賦值的用法
  4. 提取MapInfo地圖數(shù)據(jù)中的空間到SQL Server 2008
  5. SQL Server在存儲過程中編寫事務(wù)處理代碼的三種方法
責(zé)任編輯:趙鵬 來源: 火魔網(wǎng)
相關(guān)推薦

2009-07-14 16:16:04

JDBC update

2011-03-16 08:54:45

Oracle數(shù)據(jù)庫索引

2011-05-24 14:48:46

壓縮數(shù)據(jù)庫

2023-11-16 17:12:33

數(shù)據(jù)庫oracle

2010-04-02 18:30:41

Oracle數(shù)據(jù)庫

2010-04-19 13:31:42

Oracle索引

2011-08-04 09:32:23

2010-04-07 17:45:22

Oracle位圖索引

2010-05-10 18:54:12

Oracle數(shù)據(jù)庫索引

2011-04-11 16:50:13

Oracle數(shù)據(jù)庫索引

2010-04-26 14:24:58

Oracle數(shù)據(jù)庫索引

2010-04-09 13:59:48

Oracle數(shù)據(jù)庫索引

2011-03-07 17:51:00

Oracle數(shù)據(jù)庫優(yōu)缺點

2009-04-22 14:19:32

Oracle中文索引基礎(chǔ)

2019-11-29 07:37:44

Oracle數(shù)據(jù)庫索引

2009-06-11 13:12:59

Oracle索引創(chuàng)建索引

2015-04-01 11:36:25

SQL Server索SQL Server調(diào)數(shù)據(jù)庫索引

2011-08-12 12:34:27

Oracle數(shù)據(jù)庫consistent

2011-08-11 16:55:34

Oracle數(shù)據(jù)庫AWR

2010-04-21 14:45:39

Oracle數(shù)據(jù)庫
點贊
收藏

51CTO技術(shù)棧公眾號