`

oracle sql语句优化总结

 
阅读更多
1.直接路径读方式

--直接路径读方式
drop table test;
create table test  as select * from dba_objects where 1=2;
set timing on
insert  /*+ append */ into test select * from t;
commit;
--注意这个直接路径方式插入试验输出的物理读(这是首次读哦)
set autotrace traceonly
select 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.50



SQL>--使用绑定变量

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 on
SQL> 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.21




SQL> 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 on
SQL> insert  /*+ append */ into test select * from t;
已创建4664384行。
已用时间:  00: 00: 05.01




SQL> --测试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 on
SQL> 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 traceonly
set 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




分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    ORACLE SQL语句优化总结

    【ORACLE SQL语句优化总结】 在Oracle数据库中,SQL语句的优化是提升系统性能的关键环节。以下是一些常见的优化策略: 1)选择最有效的表名顺序:Oracle的解析器按照FROM子句中表的右到左顺序处理,基础表...

    Oracle Sql语句转换成Mysql Sql语句

    本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要差异在于以下几个方面: 1. **数据类型**:Oracle支持的数据类型如NUMBER、LONG、RAW等在...

    ORACLEsql语句优化

    ORACLEsql语句优化,性能优化,语句技巧优化

    ORACLE SQL性能优化系列

    ORACLE SQL性能优化系列 ORACLE SQL性能优化是数据库管理员和开发者非常关心的一个话题。为了提高数据库的性能,ORACLE 提供了多种优化技术。下面我们将详细介绍 ORACLE SQL 性能优化系列中的一些重要知识点。 一...

    Oracle sql语句优化规则汇总

    ### Oracle SQL语句优化规则详解 #### 一、选择正确的优化器 在Oracle数据库中,SQL语句的执行效率很大程度上取决于所选的优化器。Oracle提供了三种优化器模式: 1. **基于规则的优化器(RULE)**:这是Oracle...

    Oracle SQL语句性能优化

    Oracle SQL语句性能优化是数据库管理中的关键环节,直接影响到系统的响应速度和资源利用效率。本文将详细探讨优化Oracle SQL语句的几个核心策略。 1. 选择合适的优化器 Oracle 提供了三种优化器:RULE(基于规则)...

    Oracle sql语句优化

    Oracle sql语句优化53个规则详解

    SQL优化 SQL优化软件 SQL优化工具

    3. **建议与改写**:自动提供优化建议,包括修改SQL语句结构、创建或调整索引、优化连接方式等,有时甚至可以直接改写SQL语句以提高性能。 4. **历史记录与报告**:记录SQL语句的执行历史,生成性能报告,便于跟踪...

    Oracle SQL 语句优化

    Oracle SQL 语句优化,

    OracleSQL的优化.pdf

    Oracle SQL 优化 Oracle SQL 优化是数据库性能优化的关键部分。为了提高数据库的性能,我们需要从五个方面进行调整:去掉不必要的大型表的全表扫描、缓存小型表的全表扫描、检验优化索引的使用、检验优化的连接技术...

    Oracle sql语句大全

    Oracle sql语句大全. sql语句的优化资料

    oracle 中SQL语句优化

    oracle中SQL语句优化

    ORACLE数据库SQL语句编写优化总结.rar

    2. **SQL语句优化技巧**: - **选择适当的WHERE子句**:使用索引来提高查询速度,避免全表扫描。 - **使用绑定变量**:避免SQL注入,提高执行计划的重用率。 - **减少数据访问**:精确选择需要的列,避免SELECT *...

    Oracle SQL语句优化技术分析

    ### Oracle SQL语句优化技术分析 #### 概述 Oracle SQL语句优化是数据库管理中的一个重要环节,通过优化SQL语句可以显著提升系统的响应速度、提高数据库资源的利用率以及改善用户体验。本文将从多个角度出发,详细...

    ORACLESQL性能优化.pptx

    Oracle SQL 语句优化的重要性是不言而喻的。开发人员不能只关注功能的实现,不管性能如何。开发人员不能把 Oracle 当成一个黑盒子,必须了解其结构、处理 SQL 和数据的方法。必须遵守既定的开发规范,未经过 SQL ...

    oracle的SQL语句调优总结

    oracle的SQL语句调优总结,Oracle语句优化53个规则详解。

Global site tag (gtag.js) - Google Analytics