信息产业培训网

数据库进阶:Oracle中SQL语句执行效率的查找与解决[3]

http://www.miiceic.org.cn   2008-5-6 14:51:54   中程在线   浏览数:
关键字:

• 如何选择访问路径: CBO首先检查WHERE子句中的条件以及FROM子句,确定有哪些访问路径是可用的。然后CBO使用这个访问路径产生一组可能的执行计划,再通过索引、表的统计信息评估每个计划的成本,最后优化器选择成本最低的一个。

  • 表的连接方式:

  Nested Loops会循环外表(驱动表),逐个比对和内表的连接是否符合条件。在驱动表比较小,内表比较大,而且内外表的连接列有索引的时候比较好。当SORT_AREA空间不足的时候,Oracle也会选择使用NL。基于Cost的Oracle优化器(CBO)会自动选择较小的表做外表。(优点:嵌套循环连接比其他连接方法有优势,它可以快速地从结果集中提取第一批记录,而不用等待整个结果集完全确定下来。缺点:如果内部行源表(读取的第二张表(内表)已连接的列上不包含索引,或者索引不是高度可选时, 嵌套循环连接效率是很低的。如果驱动行源表(从驱动表中提取的记录)非常庞大时,其他的连接方法可能更加有效。)

  SORT- merge JOIN,将两表的连接列各自排序然后合并,只能用于连接列相等的情况,适合两表大小相若的情况(在缺乏数据的选择性或者可用的索引时,或者两个源表都过于庞大(超过记录数的5%)时,排序合并连接将比嵌套循环连更加高效。但是,排列合并连接只能用于等价连接(WHERE D.deptno=E.dejptno,而不是WHERE D.deptno>=E.deptno)。排列合并连接需要临时的内存块,以用于排序(如果SORT_AREA_SIZE设置得太小的话)。这将导致在临时表空间占用更多的内存和磁盘I/O。)

  HASH JOIN在其中一表的连接列上作散列,因此只有另外一个表做排序合并,理论上比SORT JOIN会快些,需要有足够的内存,而且打开了SORT_JOIN_ENABLE参数。(当缺少有用的索引时,哈希连接比嵌套循环连接更加有效。哈希连接可能比排序合并连接更快,因为在这种情况下只有一张源表需要排序。哈希连接也可能比嵌套循环连接更快,因为处理内存中的哈希表比检索B_树索引更加迅速。和排序合并连接、群集连接一样,哈希连接只能用于等价连接。和排序合并连接一样,哈希连接使用内存资源,并且当用于排序内存不足时,会增加临时表空间的I/O(这将使这种连接方法速度变得极慢)。最后,只有基于代价的优化器才可以使用哈希连接。)

  BNo2: AUTOTRACE

  •set autotrace 使用步骤:

  1、以system登录

  2、创建plustrace角色; \sqlplus\admin\plustrce.sql

  3、向常规用户授予权限:grant plustrace to

  4、如果没有plan_table也要创建: \rdbms\admin\utlxplan.sql

  • set autotrace 选项

  on 显示查询结果,执行计划,统计数据

  on statistics 显示查询结果,统计数据,不显示执行计划

  on explain 显示查询结果,执行计划,不显示统计数据

  traceonly 显示执行计划和统计结果,但不包括查询结果

  traceonly statistics 仅显示统计数据

  recursive calls 在用户级别和系统级别上生成的递归调用的数量。Oracle维护了一些用于内部处理的表。当oracle需要对这些表进行更改时,它就会在内部生成一个SQL语句,然后这个语句再生成一个递归调用。

  db block gets 请求一个CURRENT块的次数

  consistent gets 为一块请求consistent read的次数

  physical reads 从磁盘读取得数据块总数。这个数量等于“直接物理读取”的值加上读入缓冲区的所有数据块

  redo size 生成的重做的总数量(以字节为单位)

  bytes sent via SQL * Net to client 从前台进程发送给客户的总字节数

  bytes received via SQL * Net from client 通过Oracle Net从客户接收的总字节数

  SQL*Net roundtrips to/from client 发送给客户和从客户接收的Oracle Net消息的总数

  sorts (memory) 完全在内存中执行并且不需要任何磁盘写入的排序操作的数量

  >

  db block gets 请求一个CURRENT块的次数

  consistent gets 为一块请求consistent read的次数

  physical reads 从磁盘读取得数据块总数。这个数量等于“直接物理读取”的值加上读入缓冲区的所有数据块

  redo size 生成的重做的总数量(以字节为单位)

  bytes sent via SQL * Net to client 从前台进程发送给客户的总字节数

  bytes received via SQL * Net from client 通过Oracle Net从客户接收的总字节数

  SQL*Net roundtrips to/from client 发送给客户和从客户接收的Oracle Net消息的总数

  sorts (memory) 完全在内存中执行并且不需要任何磁盘写入的排序操作的数量

 

来源:
相关连接
最新评论
*以下网友发言不代表中程在线网站的观点和看法
    我要评论

    请您注意
    1、遵守中华人民共和国的各项有关法律规定
    2、承担一切因您的行为而导致的法律责任
    3、本网留言管理人员有权删除其管辖留言内容
    4、您在本网的留言本网有权在网站内转载和引用
    5、参与本留言即表明您已经阅读并接受上述条款
    我爱研发网希赛网软件测试网中电华信太平洋电脑网天空网
    电脑爱好者泡泡网华军软件霏凡软件站软件开发网腾讯网
    eNet下载汉化新世纪小熊在线BIOS之家数动连线....[更多]
    关于我们 | 网站地图 | 周边住宿 | 行车路线 | 联系我们 | 网站律师 | 意见反馈 | 虚位以待 | 友情链接
    中程在线(北京)科技有限公司 版权所有
    总 部:北京市海淀区青东商务楼A座西四层
    企业培训部:010-52636110 52636106 就业培训部:010-68716925 68716926
    邮 件:training@miiceic.org.cn
    京ICP备06053134号
    Copyright © 2005-2008 Miiceic.org.cn All Rights Reserved