无法深入解析Oracle索引。

一个典型的问题是:它有时表示明建中有索引,但查询过程显然没有使用相关索引,导致了耗时较长的过程和庞大的资源。有什么问题吗按照下面的顺序,我们基本上可以找到原因。

寻找原因的步骤
首先,我们要确定什么样的数据库运行优化模型,相应的参数是:optimizer_mode.you可以运行showparameteroptimizer_mode在重建看。设置自oraclev7应该选择如果参数设置规则的默认表是否是分析或没有,1
RBO的选择,除非是在语句执行的提示。

其次,检查是否索引或组合索引首先出现在WHERE语句的WHERE子句中,这是计划的实现。
使用相关指标的必要条件。

第三、看什么类型的连接使用。甲骨文共有sortmergejoin(SMJ)、HashJoin(HJ)和NestedLoopJoin(NL)。当两个表的连接,和一个索引是建立在内部表的目标列,只有nestedloop可以有效地应用到index.smj只能避免数据整理的过程中,即使指数是对相关column.hj索引,由于需要做哈希运算,索引的存在对数据查询的速度影响不大。

第四、看是否连接以允许使用的相关指标。假定emp表deptno列有一个索引,表系列deptno列上的索引都没有,而在语句有EMP。表dept.deptno条件。使NL连接时,首先访问EMP外观。由于连接机制、数据访问方式是全表扫描,并对emp.deptno指标显然是无用的。
指数全扫描或指数快速全扫描。

第五,是否使用系统数据字典表或视图。由于系统数据字典表没有被分析,它可能导致执行计划非常糟糕。但不要对数据字典表进行未经授权的分析,否则可能导致死锁或系统性能下降。

第六、是否存在潜在的数据类型转换。如果字符型数据与数值数据相比,Oracle会自动转换成字符型的to_number()函数,导致第六现象的发生。

第七,有可能收集到足够的统计数据表和相关的索引。最好是分析表和索引定期增加、删除和修改数据,并使用SQL语句analyzetablexxxxcomputestatisticsforallindexes;,Oracle能够掌握实际的统计数据做出正确的选择。

第八,索引列的选择性不高。我们假设的典型案例,用emp表,有数据的一百万线,但在emp.deptno柱,有4个不同的值,如10, 20, 30,和40。虽然有很多EMP数据行,Oracle的默认确认表的值是均匀分布在所有的数据行,也就是说,每个deptno值有25万对应的数据行。假设SQL搜索条件表10,基于deptno列索引数据检索的效率往往是不高于全表扫描。Oracle自然忽略了索引,认为索引的选择性不高,但我们考虑另一个例子。如果一百万行的数据实际上是不均匀分布的4个deptno值之间,99万行对应105000行,203000行对应的值,对应的302000行,对应值的40。这一数据分布模式,毫无疑问的是,如果指数可以应用,毫无疑问,效率会更高当其它deptno值除10的值进行搜索。我们可以使用索引列的分离分析,或使用分析表建立的直方图,并收集了足够的统计数据对这个栏目,这样甲骨文能指标对搜索价值高。

第九,索引列值是否为空(NULL)。如果索引列值可以是空值,则在SQL语句中,那些需要返回null值的操作将不使用索引,如计数(*),但使用全表扫描。这是因为索引中的存储值不能全部是空的。

第十一,看它是否是一个有用的并行查询(打印队列操作员)。指标不能用于并行查询。如果我们想要使用ind_col1索引表,可以采用以下方式:选择 / * +指数(aind_col1)* / * fromawherecol1 = xxx;注意注释必须跟着选择,和注释注释开始 / * +或-,或暗示将被视为一个总的评论,没有任何影响的PL / SQL语句的执行。一个是explaintable方式。用户必须首先在自己的模式建立plan_table表(图式),执行计划的每一步都会记录在表和表的SQL建是utlxplan.sql美元{ oracle_home } / / /数据库管理员。


打开SQL * Plus,进入setautotraceon,运行SQL语句进行调试。在给出查询结果,Oracle将显示相应的执行计划,包括优化型、执行成本、连接方式、连接顺序和数据搜索路径。
以及连续阅读、物理阅读等相应的资源成本,如果我们不能确定需要跟踪的特定SQL语句,比如应用程序一段时间,响应速度就会突然减慢。
另一个强大的工具,tkprof,Oracle提供的,可用于跟踪应用程序的执行过程。

首先要找出在系统视图V $ SESSION相应的SID和串行#,根据用户名或机器的连接数据库系统或其他用户的dbms_system包执行执行执行
dbms_system.set_sql_trace_in_session(SID,串行#,true);然后运行该应用程序。然后,数据库参数user_dump_dest目录下显示的服务器端,ora__xxxx.trc文件将生成,其中xxxx是被跟踪的操作系统的进程数。

当应用程序执行时,该文件是使用命令tkprof分析。命令的例子:tkproftracefileoutputfileexplain =用户名/密码。在该操作系统下Oracle用户类型的tkprof,并且会有一个详细的命令帮助。在分析输出文件outputfile,大约有执行计划的重要信息,CPU占用,物理读取次数,逻辑读取次数和运行时间每PL / SQL语句。根据输出文件的信息,我们可以快速找出PL / SQL语句的应用是问题的症结所在。