30.用WHERE替代ORDER BY
ORDER BY 子句只在两种严格的条件下使用索引.
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
ORDER BY中所有的列必须定义为非空.
WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.
例如:
表DEPT包含以下列:
DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
非唯一性的索引(DEPT_TYPE)
低效: (索引不被使用)
SELECT DEPT_CODE
FROM DEPT
ORDER BY DEPT_TYPE
高效: (使用索引)
SELECT DEPT_CODE
FROM DEPT
WHERE DEPT_TYPE > 0
注:
ORDER BY 也能使用索引!
31.避免改变索引列的类型
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.
假设 EMPNO是一个数值类型的索引列.
SELECT …
FROM EMP
WHERE EMPNO = ‘123’
实际上,经过ORACLE类型转换, 语句转化为:
SELECT …
FROM EMP
WHERE EMPNO = TO_NUMBER(‘123’)
31.避免改变索引列的类型
幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.
现在,假设EMP_TYPE是一个字符类型的索引列.
SELECT …
FROM EMP
WHERE EMP_TYPE = 123
这个语句被ORACLE转换为:
SELECT …
FROM EMP
WHERE TO_NUMBER(EMP_TYPE)=123
因为内部发生的类型转换, 这个索引将不会被用到!
注:
为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型.
32.需要当心的WHERE子句
某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.
在下面的例子里, ‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
不使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT !=0;
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >0;
下面的例子中, ‘||’是字符连接函数. 就象其他函数那样, 停用了索引.
不使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME||ACCOUNT_TYPE=’AMEXA’;
使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = ‘AMEX’
AND ACCOUNT_TYPE=’ A’;
下面的例子中, ‘+’是数学函数. 就象其他数学函数那样, 停用了索引.
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT + 3000 >5000;
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT > 2000 ;
下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描.
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,’%’);
34. CBO下使用更具选择性的索引
基于成本的优化器(CBO, Cost-Based Optimizer)对索引的选择性进行判断来决定索引的使用是否能提高效率.
如果索引有很高的选择性, 那就是说对于每个不重复的索引键值,只对应数量很少的记录.
比如, 表中共有100条记录而其中有80个不重复的索引键值. 这个索引的选择性就是80/100 = 0.8 . 选择性越高, 通过索引键值检索出的记录就越少.
如果索引的选择性很低, 检索数据就需要大量的索引范围查询操作和ROWID 访问表的
操作. 也许会比全表扫描的效率更低.
注:
下列经验请参阅:
a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.
b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的
区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!
35.避免使用耗费资源的操作
带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎
执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序.
例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP BY会触发嵌入排序(NESTED SORT) ; 这样, 每个查询需要执行一次排序, 然后在执行UNION时, 又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行. 嵌入的排序的深度会大大影响查询的效率.
通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写.
注:
如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强
36.使用显式的游标(CURSORs)
使用隐式的游标,将会执行两次操作. 第一次检索记录, 第二次检查TOO MANY ROWS 这个exception . 而显式游标不执行第二次操作.
37.优化EXPORT和IMPORT
使用较大的BUFFER(比如1MB , 1,024,000)可以提高EXPORT和IMPORT的速度.
ORACLE将尽可能地获取你所指定的内存大小,即使在内存不满足,也不会报错.
38.分离表和索引
总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘控制卡控制的硬盘上.
分享到:
相关推荐
当应用管理员向我们通告现在应用很慢、数据库很慢的时侯,我们到数据库时做几个示例的Select也发现同样的问题时,有些时侯我们会无从下手,因为我们认为数据库的各种命种率都是满足Oracle文档的建议。
让Oracle跑得更快__Oracle_10g性能分析与优化主要针对oracle性能调优进行详细分析。并且该文档提供了很好的oracle性能优化建议。
Oracle调优之初始化参数说明及建议,很有用的数据库优化参考文档.供初级的朋友数据库调优参考.要上dba道路,从这里看起
oracle游标溢出调优着眼点枚举。通过对相关数据字典和参数的分析,给出建议。
*以oracle公司提供的建议为主、关系型数据库的理论为辅,学习oracle数据库的工作原理。 *真正熟悉sga的内涵,进而提升oracle服务器的性能。 *像协奏曲那样,让oracle数据库相关文件彼此正常且有效率地分工协作。 *...
不错的东东,通俗易懂,建议学习.赶紧下载吧
orcale的sql调优
数据库性能调优技术1索引调优,详细讲述了关于索引调优的方法建议
4、建议有兴趣的同学去学习一下 oracle plsql 编写技巧,能在 plsql 缩写技能与编程 思想上有所提升。 5、Awr 二个包的代码极其复杂,对学习者的 plsql 编写能力有要求。 6、对应的二个包还包括 ADDM,ASH 的源码,...
oracle数据库的经典调优文档,建议dba深入阅读
86.超过2g的segment(单个表超过2g建议使用分区表) 87.数据库长事务(执行超过6s) 88.产生大量物理读的进程 89.产生归档日志过快的进程 90.等待事件对应的sql语句 91.占用大量temp表空间的session和sql监控 92....
下面将在 Hardware (Server)、Disk I/O、Application、Oracle Database 提出 了一系列优化建议。本文档将对相关技术细节进行总结。 文档将包括如下主要内容: z Oracle Database 性能数据收集、分析和调优方法 z ...
oracle rac日常基本维护命令 2 Oracle RAC性能调整 12 详解Oracle RAC入门和提高 27 ORACLE RAC数据库配置Dataguard环境 49 老白对于RAC应用调优的建议 51
图形化、实时显示 Oracle Instance的活动状态 利用数据流、图形、颜色和声音等方式报警,识别系统问题 显示有关问题的详细信息,如活动的 Sessions、资源消耗大的SQL语句、Disk I/O以及...内置调优建议 与其它模块集成
以下对TOAD有关疑问解答和技巧描述都是基于Toad for Oracle Xpert(Version 11.6.1.6,Toad for Oracle Xpert是Toad调优版,包括了专业版全部功能。额外增加了SQL调优功能。),如果与大家在实际工作中遇到情况有所...
通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 ...
通过学习《Oracle Database 11g完全参考手册》,您可以了解如何实现最新的安全措施,如何调优数据库的性能,如何部署网格计算技术。附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 ...
适合有一定oracle运维经验的人看的一本调优的好书,建议阅读。
详细讲述RHEL5.4+ORACLE11G+WEBLOGIC10.3各自安装步骤和集群步骤...包括资源中心系统部署结构,整体部署方案,性能调优建议三大部分,图文并茂,有详细步骤截图.非常适合初学者学习,也适合有一经验的工作者作为技术参考资料
Oracle性能优化是针对数据优化的一些方法和建议,里面讲解的很详细,从为什么要优化,讲到缓存,连接池,SGA,SQL调优,优化器等等。。对于有这方面需求的朋友来说,很有帮助的,也是很难得的。