OracleOracle数据库不可能采纳索引的原因定位

原稿出自【比特网】,转发请保留原著链接:http://soft.chinabyte.com/database/469/12318969.shtml

  命令示例:” tkprof tracefile outputfile explain=userid/password”
.在操作系统 ORACLE 用户下,键入” tkprof
“,会有详实的通令援救。分析后的输出文件 outputfile 中,有每一条 PL/SQL
语句的”执行布署”、 CPU
占用、物理读次数、逻辑读次数、执行时间长度等关键音讯。依据输出文件的消息,我们能够快捷发现使用中哪条
PL/SQL 语句是难题的症结所在。

  其次,检查被索引的列或组合索引的首列是还是不是出现在 PL/SQL 语句的 WHERE
子句中,这是”执行安顿”能。

  第伍,是或不是用到系统数据字典表或视图。由于系统数据字典表都未被解析过,或者造成极差的”执行陈设。

  第柒,是或不是为表和连锁的目录搜集丰硕的总结数据。对数码平日有增、删、改的表最佳定期对表和目录进行分析,可用
SQL 语句” analyze table xxxx compute statistics for all indexes;” .
ORACLE 掌。

  第1,看使用了哪一种档次的总是格局。 ORACLE 的共有 Sort Merge Join (
SMJ )、 Hash Join ( HJ )和 Nested Loop Join ( NL
)。在两张表连接,且内表的目的列上建有目录时,唯有 Nested Loop
才能有效地选择到该索引。 SMJ
即使相关列上建有目录,最多只可以因索引的存在,制止数据排序过程。 HJ
由于须做 HASH 运算,索引的留存对数码查询速度差不多从未影响。

 Oracle数据库有时候出现不可能动用索引的场景,出现本场景的缘故有那多少个,该怎么去稳定呢?本文我们主要就介绍那1局部情节。

  大家要先在系统视图 V$SESSION 中,可依据 USEEscortID 或 MACHINE
,查出相应的 SID 和 SE牧马人IAL# .以SYS 或其余有履行 DBMS_SYSTEM
程序包的用户连接数据库,执行” EXECUTE
DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION ( SID , SERIAL# , TRUE
);”.然后运转应用程序,那时在劳务器端,数据库参” USEPRADO_DUMP_DEST
“提示的目录下,会变卦 ora__xxxx.trc 文件,当中 xxxx
为被跟踪应用的操作系统进度号。应用程序执行到位后,用命令 tkprof
对该公文进行解析。

  首先,大家要规定数据库运营在何种优化格局下,相应的参数是:
optimizer_mode .可在 svrmgrl 中运行” show parameter optimizer_mode”
来查阅。 ORACLE V柒 以来缺省的装置应是 “choose”
,即只要对已分析的表查询的话选取 CBO ,不然选择 RBO .假若该参数设为” rule
“,则不论表是或不是分析过,一概选择 RBO ,除非在讲话中用 hint 强制。

  关于Oracle数据库不可能利用索引的来由定位就介绍到那里了,希望本次的牵线能够对您有所支持。

  用户必须首先在协调的形式( SCHEMA )下,建立 PLAN_TABLE
表,执行布署的每一步骤都将记录在该表中,建表 SQL 脚本为在
${ORACLE_HOME}/rdbms/admin/ 下的 utlxplan.sql 打开 SQL*PLUS ,输入” SET
AUTOTRACE ON “,然后运转待调节和测试的 SQL 语句。在提交查询结果后, ORACLE
将显示相应的”执行布署”,包含优化器类型、执行代价、连接格局、连接各类、数据检索路径以若是我们无法明确要求跟踪的有血有肉
SQL 语句,比如有个别应用使用壹段时间后,响应速度忽然变慢。我们那时候能够动用
ORACLE 提供的另1个有力工具 TKPROF ,对运用的实施进程全程跟踪。

  第七,索引列值是还是不是可为空( NULL )。如果索引列值能够是空值,在 SQL
语句中那一个急需回到 NULL 值的操作,将不会用到目录,如 COUNT ( *
),而是用全表扫描。这是因为索引中蕴藏值不能够为全空。

  第伍,是还是不是留存潜在的数据类型转换。如将字符型数据与数值型数据比较,
ORACLE 会自动将字符型用to_number()
函数实行转换,从而致使第陆种情景的发出。

  一种是 EXPLAIN TABLE 方式。

  第九,索引列的选拔性不高。 大家只要典型气象,有表emp
,共有一百万行数据,但里边的emp.deptno列,数据唯有 4 种差别的值,如 拾 、
20 、 30 、 40 .即使 emp 数据行有很多, ORACLE
缺省认同表中列的值是在颇具数据行均匀分布的,也正是说每个 deptno 值各有
二伍 万数据行与之相应。就算 SQL 搜索条件 DEPTNO=十 ,利用 deptno
列上的目录举办数据检索频率,往往不如全表扫描的高, ORACLE 理不是在肆种deptno 值间平均分配,当中有9九 万行对应着值10 , 伍仟 行对应值 20 , 三千行对应值 30 , 2000 行对应值 40 .在那种数据分布图案中对除值为 拾 外的其它deptno
值搜索时,毫无疑问,假诺索引能被利用,那么功能会高出很多。我们可以行使对该索引列进行独立分析,或用
analyze 语句对该列建立直方图,对该列搜集丰硕的总结数据,使 ORACLE
在查找选拔性较高的值能用上索引。

  第陆,看连接各类是或不是允许使用有关索引。倘若表 emp 的 deptno
列上有索引,表 dept 的列 deptno 上无索引, WHERE 语句有
emp.deptno=dept.deptno 条件。在做NL 连接时, emp
做为外表,先被访问,由于三番五次机制原因,外表的数额访问情势是全表扫描,
emp.deptno 上的目录鲜明是用不上,最多在其上。

  第7,看是或不是有利用并行查询( PQO
)。并行查询将不会用到目录。如大家想要用到A 表的IND_COL1 ” SELECT /*+
INDEX ( A IND_COL1 ) */ * FROM A WHERE COL壹 =
XXX;”注意,注释符必须跟在SELECT之后,且注释中的” + “要跟随注释先导符”
/* “或” — “,不然 hint 就被认为是1般注释,对 PL/SQL
语句的实践不发生别的影响。

相关文章