oracle SQL性能优化
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE为管理上述3种资源中的内部花费
ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
SQL_TEXT
FROM V$SQLAREA
WHERE EXECUTIONS>0
AND BUFFER_GETS > 0
AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
ORDER BY 4 DESC;
SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E
(高效):
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X'
FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
举例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
SELECT * FROM EMP WHERE DEPTNO >=4
低效:
SELECT * FROM EMP WHERE DEPTNO >3
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
高效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = “MELBOURNE”
低效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.
SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30
高效
SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
高效: (索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;
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'
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
ORDER BY中所有的列必须定义为非空.
WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.
表DEPT包含以下列:
DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE
高效: (使用索引)
SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0
SELECT … FROM EMP WHERE EMPNO = ‘123'
实际上,经过ORACLE类型转换, 语句转化为:
SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123')
幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.
现在,假设EMP_TYPE是一个字符类型的索引列.
SELECT … FROM EMP WHERE EMP_TYPE = 123
这个语句被ORACLE转换为:
SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123
因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型
在下面的例子里, (1)‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2) ‘||'是字符连接函数. 就象其他函数那样, 停用了索引. (3) ‘+'是数学函数. 就象其他数学函数那样, 停用了索引. (4)相同的索引列不能互相比较,这将会启用全表扫描.
b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!
执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强
SELECT JOB , AVG(SAL)
FROM EMP
GROUP JOB
HAVING JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'
高效:
SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'
GROUP JOB
转载于:https://www.cnblogs.com/hibernate3-example/archive/2008/01/30/2493140.html
oracle SQL性能优化相关推荐
- Oracle SQL性能优化的40条军规
Oracle SQL性能优化的40条军规 1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 & ...
- oracle 性能优化培训,ORACLE SQL性能优化(内部培训资料)
ORACLE SQL性能优化系列 (一) 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) ...
- ORACLE SQL性能优化系列 (一) black_snai
2019独角兽企业重金招聘Python工程师标准>>> ORACLE SQL性能优化系列 (一) 原创 2003年07月21日 18:34:00 标签: oracle / sql / ...
- ORACLE+SQL性能优化
1. 访问Table的方式 ORACLE 采用两种访问表中记录的方式: a. 全表扫描 全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方 ...
- oracle性能优化求生...,Oracle,SQL性能优化之探究|《oracle性能优化求生指南》
摘 要 在数据库应用中,根据用户提交的查询请求,如何才能精炼又高效地得到查询结果?从多个角度描述怎样优化SQL语句.实验结果表明,SQL优化能够减轻系统资源的占用,满足用户的要求. 关键词 SQL优化 ...
- java criteria限制条数_java架构—Oracle SQL性能优化
(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先 ...
- Oracle SQL性能优化40条,值得收藏
1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行&q ...
- Oracle SQL性能优化技巧大总结
(1) 选择最有效率的表名顺序 ( 只在基于规则的优化器中有效 ) : Oracle 的解析器按照从右到左的顺序处理 FROM 子句中的表名, FROM 子句中写在最后的表 ( 基础表 driving ...
- Oracle SQL性能优化 SQL优化
(1) 选择最有效率的表名顺序(只在基于规则的优化器(Oracle有两种优化器:RBO基于规则的优化器和CBO基于成本的优化器)中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表 ...
最新文章
- python简介怎么写-python怎么写函数
- mathematica实现闭包
- element-ui中用el-dialog+el-table+el-pagination实现文件默认选中且在分页的条件下有记忆功能...
- AC日记——3的幂的和 51nod 1013
- LeetCode 859. 亲密字符串
- 广告拦截之easylist和easylistchina订阅地址
- PowerDesigner如何设计表之间的关联
- 顺序容器(1):vector
- Halcon自定义直线卡尺rake
- VS2005项目的安装与布署,包括卸载
- sqoop从mysql导入数据到hdfs_利用Sqoop将数据从数据库导入到HDFS
- 史上最详细的sqlmap使用教程
- PyCharm主题、字体设置
- offsetX,offsetLeft,offsetWidth的区别详解
- 第5章 LinearR/PLR/SVR/KNN/DTR/RFR(测算房价)
- @Value读取properties中文乱码解决方案
- L1-075 强迫症
- linux cnc 树莓派,谈谈LinuxCNC
- echarts设置主副标题位置 分开设置
- 三硬币问题的EM算法实现
热门文章
- ccls提示找不到文件
- vim 忽略大小写查找字符串
- elasticsearch 2.2+ index.codec: best_compression启用压缩
- java pom.xml 自定义变量
- 2018-12-04-Python全栈开发-day92-自动登录
- .NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接
- 接口中定义变量必须为public static final的原因
- phpstorm 使用技巧
- 第二阶段个人总结11
- IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?