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种资源中的内部花费
分享到:
相关推荐
富士康MIS 资深人员总结的Oracle PL/Sql 性能优化心得 给新进员工学习之文档 <br>绝对精华 写出专业的Sql
6. **PL/SQL性能优化** - **绑定变量**:减少解析次数,提高执行效率。 - **存储优化**:合理使用索引、分区等技术提升查询速度。 - **事务管理**:理解COMMIT、ROLLBACK和SAVEPOINT,确保数据一致性。 7. **...
10. **性能优化**:PL/SQL可以利用Oracle的内置优化器,提高SQL查询的执行效率。 PLSQL7121363这个文件名可能是指PL/SQL工具的某个版本或特定的组件,具体的功能和特性可能需要根据实际的软件来解读。在实际工作中...
8. **索引和性能优化**:手册可能也会涉及如何利用索引来提高PL/SQL程序的执行效率,以及如何分析和优化SQL语句。 9. **并发和锁定**:在多用户环境下,理解并发控制和锁定机制是必要的。手册可能会讨论如何处理...
7. **性能优化**:提供性能分析工具,如执行计划分析、SQL Tuning Advisor等,帮助优化SQL语句,提高数据库运行效率。 8. **版本控制集成**:与其他版本控制系统(如Git、SVN)无缝集成,便于版本管理和代码协同。 ...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...
《Oracle PL/SQL程序设计(第5版)(套装上下册)》不但介绍了大量的Oracle 11g的PL/SQL新性能,还提供了许多优化PL/SQL性能的新方法。 《Oracle PL/SQL程序设计(第5版)(套装上下册)》结构清晰,示例丰富,...
- **新特性概述**:介绍Oracle 11g中引入的与PL/SQL相关的新增功能,例如新的数据类型、函数、性能优化技术等。 - **性能提升技术**:提供了一些具体的例子和最佳实践,展示了如何利用Oracle 11g的新特性来进一步...
5. **报表和图表**:PL/SQL Developer提供了一定的报表生成功能,可以生成关于数据库对象的各种统计报告,如表空间使用情况、索引分析等,为数据库性能优化提供参考。 6. **连接管理**:用户可以创建多个数据库连接...
8. **性能优化**:如何编写高效的PL/SQL代码,使用绑定变量、避免全表扫描、索引优化等技巧。 通过这本书的配套源代码,读者将有机会实际操作这些概念,加深对Oracle PL/SQL的理解,并提升数据库开发技能。每个示例...
8. **性能监控**:尽管是远程连接,PL/SQL Developer仍然可以显示执行计划、统计信息和性能指标,帮助分析和优化SQL查询。 9. **版本控制集成**:PL/SQL Developer可以与各种版本控制系统(如Git、SVN)集成,这...
7. **PL/SQL性能优化**: -绑定变量:如何利用绑定变量提高查询性能。 -索引和分区:理解如何设计和使用索引来优化查询。 -PL/SQL代码优化技巧:避免不必要的计算,减少磁盘I/O,提高程序效率。 8. **PL/SQL与...
9. **索引和性能优化**:了解如何创建和使用索引,以及通过PL/SQL分析和优化SQL查询性能。 10. **并发控制**:PL/SQL中的锁定机制,如ROW LEVEL LOCKING,以及如何处理死锁问题。 11. **错误处理和日志记录**:...
8. **索引优化和性能调优**:深入研究如何利用PL/SQL进行性能分析,以及如何通过索引、物化视图、表分区等手段提升查询性能。 9. **并发控制**:介绍PL/SQL中的锁定机制,如ROWLOCK和SHARE锁,以及如何避免死锁。 ...
第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,全称Procedural Language/Structured Query Language,是Oracle数据库的一种内置编程语言,它是SQL(结构化查询语言)的扩展,增加了程序设计的元素,使得在处理数据库时可以进行更复杂的逻辑控制。PL/SQL将...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库操作能力和PL/SQL的结构化编程特性,使得数据库开发者能够创建复杂的应用程序和数据库逻辑。在"Oracle PL/SQL实例精解 数据库建立代码"中,我们将深入探讨...
10. **性能优化**:教材可能涵盖性能监控和调优技术,如分析SQL语句的执行计划,使用绑定变量,以及如何使用PL/SQL Profiler进行性能分析。 11. **数据库对象的动态SQL**:通过EXECUTE IMMEDIATE和DBMS_SQL包,可以...
3. PL/SQL性能优化 - SQL优化:避免全表扫描,使用索引,优化JOIN操作,减少子查询,合理使用绑定变量。 - PL/SQL代码优化:减少不必要的数据访问,合理使用缓存,避免冗余计算,优化循环结构。 - 分区和并行执行...
Oracle PL/SQL是一种强大的编程语言,它将关系数据库的强大功能与结构化编程的优点结合在一起,是Oracle数据库系统中不可或缺的一部分。在"Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本"中,读者可以深入...