首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Oracle频道
中国IT教育
Google
首页 入门基础 安装配置 体系架构 PLSQL 备份恢复 性能调优 开发技术 资讯动态 考试认证 下载 专题 讨论
您现在的位置: 中国IT实验室 >> Oracle >> 入门基础 >> 正文

Oracle中SQL语句执行效率的查找与解决

• 表的连接方式:

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] 

【责编:Ken】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Oracle频道相关导航