当前位置:七道奇文章资讯数据防范Oracle防范
日期:2011-03-21 00:21:00  来源:本站整理

为什么有时数据库不用索引来查找数据[Oracle防范]

赞助商链接



  本文“为什么有时数据库不用索引来查找数据[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

当你应用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防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 为什么有这个独特的筹划
  • 为什么有时数据库不用索引来查找数据
  • <b>为什么有时Oracle数据库不用索引来查找数据?</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .