网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.IP地址变化后Oracle 10g如何才能.
.关于SQL的执行计划。.
.Oracle数据库性能优化技术.
.获得Oracle各内存段的内部信息(.
.Oracle 数据库向 MS SQL Server .
.手工创建Oracle数据库脚本及说明.
.推荐:学习使用 Oracle触发器心得.
.JAVA连接Oracle的代码.
.自己整理的OCI文档,抛砖引玉.
.系统从oracle版本转化为sqlserve.
.Java开发中使用Oracle数据库的一.
.用SQL进行多表查询.
.教你如何重建Oracle数据库的回滚.
.ORACLE数据库常见问题诊断方法 -.
.oracle10g无法连接错误排除.
.Oracle数据库中COALESCE函数使用.
.Oracle:10.0.1.2.0中的程序缺陷.
.Oracle 体系结构介绍.
.通过幸存oracle文件修复oracle9i.
.10gRAC系列之cluvfy用法及验证错.

ORACLE SQL性能优化系列 (十二)

发表日期:2008-2-9


Oracle SQL性能优化系列 (十二) 
39. 总是使用索引的第一个列 假如索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.   译者按: 这也是一条简单而重要的规则. 见以下实例.   SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10)); Table created. SQL> create index multindex on multiindexusage(inda,indb); Index created. SQL> set autotrace traceonly   SQL> select * from multiindexusage where inda = 1; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE Access (BY INDEX ROWID) OF 'MULTIINDEXUSAGE' 2 1 INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE)   SQL> select * from multiindexusage where indb = 1; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE'   很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引     40. ORACLE内部操作 当执行查询时,ORACLE采用了内部的操作. 下表显示了几种重要的内部操作. ORACLE Clause
内部操作 ORDER BY
SORT ORDER BY UNION
UNION-ALL MINUS
MINUS INTERSECT
INTERSECT DISTINCT,MINUS,INTERSECT,UNION
SORT UNIQUE MIN,MAX,COUNT
SORT AGGREGATE GROUP BY
SORT GROUP BY ROWNUM
COUNT or COUNT STOPKEY Queries involving Joins
SORT JOIN,MERGE JOIN,NESTED LOOPS CONNECT BY
CONNECT BY    
41. 用UNION-ALL 替换UNION ( 假如有可能的话)   当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 假如用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高.   举例: 低效:     SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’ UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’ 高效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’ UNION ALL SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’   译者按: 需要注重的是,UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是 要从业务需求分析使用UNION ALL的可行性. UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这 块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量   Select substr(name,1,25) "Sort Area Name", substr(value,1,15) "Value"
from v$sysstat where name like 'sort%'   42. 使用提示(Hints) 对于表的访问,可以使用两种Hints. FULL 和 ROWID   FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. 例如: SELECT /*+ FULL(EMP) */ * FROM EMP WHERE EMPNO = 7893;   ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID的操作访问表.   通常, 你需要采用TABLE ACCESS BY ROWID的方式非凡是当访问大表的时候, 使用这种方式, 你需要知道ROIWD的值或者使用索引. 假如一个大表没有被设定为缓存(CACHED)表而你希望它的数据在查询结束是仍然停留 在SGA中,你就可以使用CACHE hint 来告诉优化器把数据保留在SGA中. 通常CACHE hint 和 FULL hint 一起使用. 例如: SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ * FROM WORK;   索引hint 告诉ORACLE使用基于索引的扫描方式. 你不必说明具体的索引名称 例如: SELECT /*+ INDEX(LODGING) */ LODGING FROM LODGING WHERE MANAGER = ‘BILL GATES’;   在不使用hint的情况下, 以上的查询应该也会使用索引,然而,假如该索引的重复值过多而你的优化器是CBO, 优化器就可能忽略索引. 在这种情况下, 你可以用INDEX hint强制ORACLE使用该索引.   ORACLE hints 还包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE, USE_HASH 等等.   译者按: 使用hint , 表示我们对ORACLE优化器缺省的执行路径不满足,需要手工修改. 这是一个很有技巧性的工作. 我建议只针对特定的,少数的SQL进行hint的优化. 对ORACLE的优化器还是要有信心(非凡是CBO)
 
 

上一篇:Oracle 9i新特性研究二(轻松取得建表和索引的DDL语句) 人气:982
下一篇:ORACLE SQL性能优化系列 (十三) 人气:1051
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐