oracle sql语句优化总结
来源:互联网 发布:深入浅出数据分析 mobi 编辑:程序博客网 时间:2024/06/03 21:33
1.直接路径读方式
2.绑定变量使得速度加快
3.批量提交使得速度加快
4.关闭日志提高性能
5.避免对列进行运算,否则将用不到索引,除非使用函数索引。
6.索引遇到like '%LJB' 或者是'%LJB%'的查询,是用不到索引的
--直接路径读方式drop table test;create table test as select * from dba_objects where 1=2;set timing oninsert /*+ append */ into test select * from t;commit;--注意这个直接路径方式插入试验输出的物理读(这是首次读哦)set autotrace traceonlyselect count(*) from test;
2.绑定变量使得速度加快
SQL>--未使用绑定变量SQL> begin 2 for i in 1 .. 100000 3 loop 4 execute immediate 5 'insert into t values ( '||i||')'; 6 end loop; 7 commit; 8 end; 9 / PL/SQL 过程已成功完成。已用时间: 00: 00: 43.50SQL>--使用绑定变量SQL> begin 2 for i in 1 .. 100000 3 loop 4 execute immediate 5 'insert into t values ( :x )' using i; 6 end loop; 7 commit; 8 end; 9 / PL/SQL 过程已成功完成。已用时间: 00: 00: 04.77
3.批量提交使得速度加快
SQL> drop table t purge;表已删除。SQL> create table t(x int);表已创建。SQL> set timing onSQL> begin 2 for i in 1 .. 100000 loop 3 insert into t1 values (i); 4 commit; 5 end loop; 6 end; 7 /PL/SQL 过程已成功完成。已用时间: 00: 00: 11.21SQL> drop table t purge;表已删除。SQL> create table t(x int);表已创建。SQL> begin 2 for i in 1 .. 100000 loop 3 insert into t values (i); 4 end loop; 5 commit; 6 end; 7 /PL/SQL 过程已成功完成。已用时间: 00: 00: 04.26
4.关闭日志提高性能
SQL> --测试直接路径读方式SQL> drop table test;表已删除。SQL> create table test as select * from dba_objects where 1=2;表已创建。SQL> set timing onSQL> insert /*+ append */ into test select * from t;已创建4664384行。已用时间: 00: 00: 05.01SQL> --测试nolgging关闭日志+直接路径读方式SQL> drop table test;表已删除。SQL> create table test as select * from dba_objects where 1=2;表已创建。SQL> alter table test nologging;表已更改。SQL> set timing onSQL> insert /*+ append */ into test select * from t;已创建4664384行。已用时间: 00: 00: 04.39
5.避免对列进行运算,否则将用不到索引,除非使用函数索引。
drop table t purge;create table t as select * from dba_objects;create index idx_object_id on t(created);set autotrace traceonlyset linesize 1000--以下写法大量的出现在开发人员的代码中,是一个非常常见的通病,由于对列进行了运算,所以用不到索引,如下:select * from t where trunc(created)>=TO_DATE('2013-12-14', 'YYYY-MM-DD')and trunc(created)<=TO_DATE('2013-12-15', 'YYYY-MM-DD');执行计划--------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 12 | 2484 | 296 (2)| 00:00:04 ||* 1 | TABLE ACCESS FULL| T | 12 | 2484 | 296 (2)| 00:00:04 |-------------------------------------------------------------------------- 1 - filter(TRUNC(INTERNAL_FUNCTION("CREATED"))>=TO_DATE(' 2013-12-14 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND TRUNC(INTERNAL_FUNCTION("CREATED"))<=TO_DATE(' 2013-12-15 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))统计信息---------------------------------------------------------- 0 recursive calls 0 db block gets 1049 consistent gets 0 physical reads 0 redo size 1390 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed ---调整为如下等价语句后,就可以用到索引了。select * from t where created>=TO_DATE('2013-12-14', 'YYYY-MM-DD')and created<TO_DATE('2013-12-15', 'YYYY-MM-DD')+1;执行计划---------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |---------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 207 | 3 (0)| 00:00:01 || 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 207 | 3 (0)| 00:00:01 ||* 2 | INDEX RANGE SCAN | IDX_OBJECT_ID | 1 | | 2 (0)| 00:00:01 |--------------------------------------------------------------------------------------------- 2 - access("CREATED">=TO_DATE(' 2013-12-14 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "CREATED"<TO_DATE(' 2013-12-16 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))统计信息---------------------------------------------------------- 0 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 1393 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
6.索引遇到like '%LJB' 或者是'%LJB%'的查询,是用不到索引的
create index idx_reverse_objname on t(reverse(object_name));set autotrace on select object_name,object_id from t where reverse(object_name) like reverse('%LJB'); OBJECT_NAME OBJECT_ID---------------------------- --AAALJB 8执行计划---------------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |---------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 3596 | 509K| 290 (0)| 00:00:04 || 1 | TABLE ACCESS BY INDEX ROWID| T | 3596 | 509K| 290 (0)| 00:00:04 ||* 2 | INDEX RANGE SCAN | IDX_REVERSE_OBJNAME | 647 | | 6 (0)| 00:00:01 |---------------------------------------------------------------------------------------------------统计信息---------------------------------------------------------- 0 recursive calls 0 db block gets 5 consistent gets 0 physical reads 0 redo size 496 bytes sent via SQL*Net to client 415 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
0 0
- ORACLE SQL语句优化总结
- ORACLE SQL语句优化总结
- oracle sql语句优化总结
- ORACLE SQL语句优化总结(一)
- ORACLE SQL语句优化总结(二)
- ORACLE SQL语句优化总结(三)
- Oracle Sql 语句优化技巧总结一
- ORACLE 中 SQL语句优化总结
- ORACLE sql 语句优化
- oracle sql语句优化
- oracle sql语句优化
- ORACLE SQL语句优化
- ORACLE SQL语句优化
- oracle sql语句优化
- oracle sql语句优化
- oracle sql语句优化
- Oracle sql语句优化
- Oracle Sql语句优化
- 正交矩阵和Gram-Schmidt正交化
- [Error!]the type java.lang.object cannot be resolved. it is indirectly reference
- react 小例子
- Spring MVC @ModelAttribute注解总结
- u-boot第二阶段启动流程分析
- oracle sql语句优化总结
- 一个数被质数分解
- 11种行为型模式之:策略模式(Strategy)
- 在centos6.5 以 anaconda2的方式安装tensorflow
- JAVA获取图片大小和尺寸【转】
- Spring-quartz使用以及动态修改cronExpression
- 编程之美二 : 中国象棋将帅问题
- iOS添加自定义自体 [UIFont fontWithName: size:](英文有效)
- 采用DECODE方法来进行特殊规则排序