学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> SQL >> Oracle SQL性能优化系列介绍(上)


Oracle SQL性能优化系列介绍(上)


1. 选用适合的ORACLE优化器

ORACLE的优化器共有3种:

a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性)

设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。

如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。

在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。

2. 访问Table的方式

ORACLE 采用两种访问表中记录的方式:

a. 全表扫描

全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描.

b. 通过ROWID访问表

你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。

3. 共享SQL语句

为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它 和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。

可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询。数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。

共享的语句必须满足三个条件:

A. 字符级的比较:

当前被执行的语句和共享池中的语句必须完全相同。

例如: SELECT * FROM EMP;

和下列每一个都不同

  SELECT * from EMP; 

  Select * From Emp; 

  SELECT * FROM EMP;

B. 两个语句所指的对象必须完全相同:

例如: 用户 对象名 如何访问

  Jack sal_limit private synonym 

  Work_city public synonym 

  Plant_detail public synonym 

  Jill sal_limit private synonym 

  Work_city public synonym 

  Plant_detail table owner

考虑一下下列SQL语句能否在这两个用户之间共享.SQL能否共享,原因select max(sal_cap) from sal_limit; 不能。每个用户都有一个private synonym - sal_limit , 它们是不同的对象 select count(*0 from work_city where sdesc like 'NEW%'; 能。两个用户访问相同的对象:

public synonym - work_city 

select a.sdesc,b.location from work_city a ,
 plant_detail b where a.city_id = b.city_id

不能。用户jack 通过private synonym访问plant_detail 而jill 是表的所有者,对象不同.

C. 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)

例如:

第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值)

a.

  select pin , name from people where pin = :blk1.pin; 
  select pin , name from people where pin = :blk1.pin;

b.

  select pin , name from people where pin = :blk1.ot_ind; 
  select pin , name from people where pin = :blk1.ov_ind;

4. 选择最有效率的表名顺序(只在基于规则的优化器中有效)

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。

例如:

表 TAB1 16,384 条记录。

表 TAB2 1 条记录。

选择TAB2作为基础表 (最好的方法) 。

select count(*) from tab1,tab2 执行时间0.96秒

选择TAB2作为基础表 (不佳的方法)

select count(*) from tab2,tab1 执行时间26.09秒

如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。

例如:

EMP表描述了LOCATION表和CATEGORY表的交集。

以下为引用的内容:

SELECT * 

FROM LOCATION L , 

CATEGORY C, 

EMP E 

WHERE E.EMP_NO BETWEEN 1000 AND 2000 

AND E.CAT_NO = C.CAT_NO 

AND E.LOCN = L.LOCN

将比下列SQL更有效率以下为引用的内容:

SELECT * 

FROM EMP E , 

LOCATION L , 

CATEGORY C 

WHERE E.CAT_NO = C.CAT_NO 

AND E.LOCN = L.LOCN 

AND E.EMP_NO BETWEEN 1000 AND 2000









5. WHERE子句中的连接顺序

ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

例如: (低效,执行时间156.3秒)

SELECT … 

FROM EMP E 

WHERE SAL >50000 

AND JOB = ‘MANAGER' 

AND 25 < (SELECT COUNT(*) FROM EMP 

WHERE MGR=E.EMPNO); 
  (高效,执行时间10.6秒) 

SELECT … 

FROM EMP E 

WHERE 25 < (SELECT COUNT(*) FROM EMP 

WHERE MGR=E.EMPNO) 

AND SAL >50000 

AND JOB = ‘MANAGER';
 

(T115)

技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"Oracle SQL性能优化系列介绍(上)"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 Oracle SQL性能优化系列介绍(上) 相关内容
Google搜索中 Oracle SQL性能优化系列介绍(上) 相关内容
雅虎中 Oracle SQL性能优化系列介绍(上) 相关内容
Sogou搜索中 Oracle SQL性能优化系列介绍(上) 相关内容

相关软件 最新回复帖子:

·nesox让电子邮件营销原来如此轻松!
·Windows Vista 中卸载软件的不同方式
·没有mysql支持时的替代方案
·一个可以发送附件及HTML格式邮件的PHP类
·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描


  相关软件 Oracle SQL性能优化系列介绍(上)相关文章
SQL Stored Procedures 的破解工具 用SQL*Loader将Excel数据导出到Oracle
教您 SQL SERVER 2005 同步复制技术 Windows 2003不太喜欢SQL Server2000
MYSQL,Oracle,SQL数据库在JSP中的驱动 SQL Server 和 Oracle 常用函数对比
一个有关多条件数据库查询的优化方法 用ADO管理SQL Server数据库及其设备
通用SQL数据库查询语句精华使用简介 Oracle中捕获问题SQL解决CPU过渡消耗
如何在Oracle数据库10g中跟踪SQL SQL Server对文件内容进行全文检索查询
ORACLE中常用的SQL语法和数据对象 Oracle中使用SQL MODEL定义行间计算
在MySQL中执行SQL语句时的几个注意点 向你谈谈SQLPlus中的复制和粘贴技巧
热点关注:IBM将与微软开始激烈对决 关于SQL Server数据库的若干注意事项
50种方法巧妙优化你的SQL Server数据库 优化SQL Server服务器内存配置的策略