`

PL/SQL性能优化(一)

阅读更多

Oracle SQL性能优化

(1)       选择最有效率的表名顺序(只在基于 规则的优化器中有效):

ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果, 交叉表是指那个被其他表所引用的表.

--在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表
--假设a表中有数据120W,b表中有数据20W
SELECT count(a.a1) FROM a,b WHERE a.a1 = b.b1

--有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表
SELECT count(a.a1) FROM a,b,c WHERE a.a1 = c.c1 and b.b1 = c.c1

 

(2)       WHERE子句中的连接顺序:
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

SELECT count(a.a1) FROM a,b WHERE a.a1 = b.b1 AND a.a1 > 100000
 

(3)       SELECT子句中避免使用 ‘ * ‘:
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间

--效率不高,SELECT count(*) FROM a;
SELECT count(a.a1) FROM a;
 

(4)       减少访问数据库的次数: 能TM的一次检索出来的话就别分多次
ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;

--当执行每条SQL语句时,ORACLE在内部执行了许多工作:解析SQL语句,估算
--索引的利用率,绑定变量,读数据块等等。由此可见,减少访问数据库的次数,
--就能实际上减少ORACLE的工作量。

--例如:
--以下有三种方法可以检索出雇员号等于0342或0291的职员在一行
--方法1:(最低效)
select emp_name, salary, grade from emp where emp_no = 342;
select emp_name, salary, grade from emp where emp_no = 291;
--方法2:(次低效)
declare
cursor c1(e_no number) is
select emp_name, salary, grade from emp where emp_no = e_no;
begin
open c1(342);
fetch c1
into .., .., ..;
open c1(291);
fetch c1
into .., .., ..;
close c1;
end;


--方法3:(高效)
select  a.emp_name, a.salary, a.grade, b.emp_name, b.salary, b.grade
from  emp a, emp b
where  a.emp_no = 342
and  b.emp_no = 291;
 

(5)       在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 不是说这个数越多越好 啊,很占逻辑 I/O,具体问题具体分析,如果想深入研究的话,请参考 Arraysize的设置以及对查询性能的影响

--Arraysize是sql*plus中可以设置的一个参数,这个参数设置的意思表
--示,sql*plus一次可以从数据库服务器端获取的记录行数。
show arraysize
arraysize 15

--可以看到,在SQL*plus中,默认设置是15。
--有效值是1-5000。我们把以下语句运行看看效果

set arraysize 15
select * from colocated a15 where x between 20000 and 30000;

set arraysize 100
select * from colocated a100 where x between 20000 and 30000;

tkprof报告显示:

(a15)
Rows     Row Source Operation
-------  ---------------------------------------------------
  10001  TABLE ACCESS BY INDEX ROWID COLOCATED (cr=1452 pr=0 pw=0 time=100109 us)
  10001   INDEX RANGE SCAN COLOCATED_PK (cr=689 pr=0 pw=0 time=40047 us)(object id 53215)

(a100)
Rows     Row Source Operation
-------  ---------------------------------------------------
  10001  TABLE ACCESS BY INDEX ROWID COLOCATED (cr=344 pr=0 pw=0 time=90081 us)
  10001   INDEX RANGE SCAN COLOCATED_PK (cr=124 pr=0 pw=0 time=30043 us)(object id 53215)
--Arraysize为15时,对索引执行了689个逻辑I/O,
--对表执行了763(1452-689)个逻辑I/O,arraysize为100时,
--对索引执行了124个逻辑I/O,
--对表执行了220个逻辑I/O。
--这说明因为表有序,
--所以在一个块中有较多需要的记录,增加arraysize可以获得良好效果。
 

(6)       使用DECODE函数来减少处理时间:
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.

--从网上找到了下面的例子,要计算两个SUM的话一般都会这样去写
   SELECT COUNT(*),SUM(SAL) FROM EMP
   WHERE DEPT_NO = 0020  AND ENAME LIKE ‘SMITH%’;

   SELECT COUNT(*),SUM(SAL) FROM EMP
   WHERE DEPT_NO = 0030  AND ENAME LIKE ‘SMITH%’;
  
--咱们用DECODE函数来试试
  SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
  FROM EMP WHERE ENAME LIKE ‘SMITH%’;

--说白了还是跟上面我说的第4个优化原理是一样的
 

(7)       整合简单,无关联的数据库访问:
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)

--下面有三条比较有代表性的语句
SELECT a.a1 FROM a WHERE a.id = 1;
SELECT b.b1 FROM b WHERE b.editdate = sysdate;
SELECT c.c1 FROM c WHERE c.id='c';

--我们一起来把他们混搭一起
SELECT a.a1,  b.b1, c.c1 FROM a,b,c,DUAL X
WHERE NVL(‘X’,X.DUMMY) = NVL(‘X’,a.ROWID(+))
AND NVL(‘X’,X.DUMMY) = NVL(‘X’,b.ROWID(+))
AND NVL(‘X’,X.DUMMY) = NVL(‘X’,c.ROWID(+))
AND a.id (+) = 1
AND b.editdate (+) = sysdate
AND c.id(+) = ‘c’; 

--看起来挺乱的,所以最好是能够将分开的写法作为注释,便于日后进行修改升级
 

(8)       删除重复记录:
最高效的删除重复记录方法 ( 因为使用了ROWID)例子:

DELETE  FROM  EMP E  WHERE  E.ROWID > (SELECT MIN(X.ROWID)
FROM  EMP X  WHERE  X.EMP_NO = E.EMP_NO);
 

(9)       用TRUNCATE替代DELETE:
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.但是truncate的应用还有很多地方需要我们仔细研究,请参考[ORACLE]浅谈truncate的使用

--表中插入1000万条数据
insert into test_table select level from dual connect by level<=10000000;
10000000 rows created.

commit;
Commit complete.
Elapsed: 00:00:00.02

truncate table test_table;
Table truncated.
Elapsed: 00:00:29.52

set autotrace traceonly statistics;
select * from test_table;
no rows selected
Elapsed: 00:00:00.00

Statistics
----------------------------------------------------------
          1  recursive calls
          1  db block gets
          6  consistent gets
          0  physical reads
         96  redo size
        318  bytes sent via SQL*Net to client
        453  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed
--truncate后再查询只做了7个逻辑读,也就是读了7个内存块。
 

(10) 尽量多使用COMMIT:
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE为管理上述3种资源中的内部花费

分享到:
评论

相关推荐

    Oracle Sql Pl/Sql 性能优化 精华

    富士康MIS 资深人员总结的Oracle PL/Sql 性能优化心得 给新进员工学习之文档 &lt;br&gt;绝对精华 写出专业的Sql

    oracle10g_pl/sql

    6. **PL/SQL性能优化** - **绑定变量**:减少解析次数,提高执行效率。 - **存储优化**:合理使用索引、分区等技术提升查询速度。 - **事务管理**:理解COMMIT、ROLLBACK和SAVEPOINT,确保数据一致性。 7. **...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    10. **性能优化**:PL/SQL可以利用Oracle的内置优化器,提高SQL查询的执行效率。 PLSQL7121363这个文件名可能是指PL/SQL工具的某个版本或特定的组件,具体的功能和特性可能需要根据实际的软件来解读。在实际工作中...

    pl/sql最新中文手册

    8. **索引和性能优化**:手册可能也会涉及如何利用索引来提高PL/SQL程序的执行效率,以及如何分析和优化SQL语句。 9. **并发和锁定**:在多用户环境下,理解并发控制和锁定机制是必要的。手册可能会讨论如何处理...

    pl/sql developer11.0

    7. **性能优化**:提供性能分析工具,如执行计划分析、SQL Tuning Advisor等,帮助优化SQL语句,提高数据库运行效率。 8. **版本控制集成**:与其他版本控制系统(如Git、SVN)无缝集成,便于版本管理和代码协同。 ...

    Oracle PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...

    Oracle PL/SQL程序设计(第5版)(套装上下册)

    《Oracle PL/SQL程序设计(第5版)(套装上下册)》不但介绍了大量的Oracle 11g的PL/SQL新性能,还提供了许多优化PL/SQL性能的新方法。  《Oracle PL/SQL程序设计(第5版)(套装上下册)》结构清晰,示例丰富,...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **新特性概述**:介绍Oracle 11g中引入的与PL/SQL相关的新增功能,例如新的数据类型、函数、性能优化技术等。 - **性能提升技术**:提供了一些具体的例子和最佳实践,展示了如何利用Oracle 11g的新特性来进一步...

    pl/sql 免安装,绿色版pl/sql

    5. **报表和图表**:PL/SQL Developer提供了一定的报表生成功能,可以生成关于数据库对象的各种统计报告,如表空间使用情况、索引分析等,为数据库性能优化提供参考。 6. **连接管理**:用户可以创建多个数据库连接...

    oracle pl/sql从入门到精通 配套源代码

    8. **性能优化**:如何编写高效的PL/SQL代码,使用绑定变量、避免全表扫描、索引优化等技巧。 通过这本书的配套源代码,读者将有机会实际操作这些概念,加深对Oracle PL/SQL的理解,并提升数据库开发技能。每个示例...

    PL/SQL Developer 远程连接Oracle数据库

    8. **性能监控**:尽管是远程连接,PL/SQL Developer仍然可以显示执行计划、统计信息和性能指标,帮助分析和优化SQL查询。 9. **版本控制集成**:PL/SQL Developer可以与各种版本控制系统(如Git、SVN)集成,这...

    pl/sql 学习资料

    7. **PL/SQL性能优化**: -绑定变量:如何利用绑定变量提高查询性能。 -索引和分区:理解如何设计和使用索引来优化查询。 -PL/SQL代码优化技巧:避免不必要的计算,减少磁盘I/O,提高程序效率。 8. **PL/SQL与...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    9. **索引和性能优化**:了解如何创建和使用索引,以及通过PL/SQL分析和优化SQL查询性能。 10. **并发控制**:PL/SQL中的锁定机制,如ROW LEVEL LOCKING,以及如何处理死锁问题。 11. **错误处理和日志记录**:...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    8. **索引优化和性能调优**:深入研究如何利用PL/SQL进行性能分析,以及如何通过索引、物化视图、表分区等手段提升查询性能。 9. **并发控制**:介绍PL/SQL中的锁定机制,如ROWLOCK和SHARE锁,以及如何避免死锁。 ...

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    第21章 PL/SQL的性能优化 753 第22章 I/O操作和PL/SQL 843 第6部分 高级PL/SQL主题 第23章 应用安全与PL/SQL 887 第24章 PL/SQL架构 947 第25章 PL/SQL的全球化和本地化 993 第26章 PL/SQL的面向对象特性 1034 附录A...

    非常好用的PL/SQL

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库的一种内置编程语言,它是SQL(结构化查询语言)的扩展,增加了程序设计的元素,使得在处理数据库时可以进行更复杂的逻辑控制。PL/SQL将...

    Oracle PL/SQL实例精解 数据库建立代码

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库操作能力和PL/SQL的结构化编程特性,使得数据库开发者能够创建复杂的应用程序和数据库逻辑。在"Oracle PL/SQL实例精解 数据库建立代码"中,我们将深入探讨...

    Oracle PL/SQL学习官方教材

    10. **性能优化**:教材可能涵盖性能监控和调优技术,如分析SQL语句的执行计划,使用绑定变量,以及如何使用PL/SQL Profiler进行性能分析。 11. **数据库对象的动态SQL**:通过EXECUTE IMMEDIATE和DBMS_SQL包,可以...

    PL/SQL开发,性能优化等文档

    3. PL/SQL性能优化 - SQL优化:避免全表扫描,使用索引,优化JOIN操作,减少子查询,合理使用绑定变量。 - PL/SQL代码优化:减少不必要的数据访问,合理使用缓存,避免冗余计算,优化循环结构。 - 分区和并行执行...

    Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本

    Oracle PL/SQL是一种强大的编程语言,它将关系数据库的强大功能与结构化编程的优点结合在一起,是Oracle数据库系统中不可或缺的一部分。在"Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本"中,读者可以深入...

Global site tag (gtag.js) - Google Analytics