PLSQL_性能优化系列13_Oracle DataScan

2014-10-04 BaoXinjian

一、摘要



二、使用复杂子查询with as来提高sql性能



利用复杂子查询with as来提高sql性能。

先看个例子:

WITH dept_costs AS (  SELECT   d.department_name, SUM (e.salary) AS dept_total
                        FROM      employees e
                               JOIN
                                  departments d
                               ON e.department_id = d.department_id
                    GROUP BY   d.department_name),
    avg_cost
       AS (SELECT   SUM (dept_total) / COUNT ( * ) AS dept_avg
             FROM   dept_costs)
  SELECT   *
    FROM   dept_costs
   WHERE   dept_total > (  SELECT   dept_avg FROM avg_cost)
ORDER BY   department_name;

在这个例子中,dept_costs相当于一个view,与view不同的是,...

用CASE EXPRESSION将

对数据的读取操作是非常消耗资源的,如何减少对数据的扫描,是提升sql效率的一个重要方面,例如物化视图技术。本篇介绍几种sql写法,分别是CASE expression/DML with returning clause /multitable insert。

二、用CASE EXPRESSION将多句查询组合在一起


SELECT   COUNT ( * )
  FROM   employees
 WHERE   salary < 2000;

SELECT   COUNT ( * )
  FROM   employees
 WHERE   salary BETWEEN 2000 AND 4000;

SELECT   COUNT ( * )
  FROM   employees
 WHERE   salary > 4000;

改写成

SELECT   COUNT (CASE WHEN salary < 2000 THEN 1 ELSE NULL END) count1,
         COUNT (CASE WHEN salary BETWEEN 2001 AND 4000 THEN 1 ELSE NULL END)
            count2,
         COUNT (CASE WHEN salary > 4000 THEN 1 ELSE NULL END) count3
  FROM   employees;

二、DML with returning clause



有时候DML操作后紧跟着对这些行的select操作。DML with returning clause将insert/update/delete操作和select操作合并在一起,避免了重复扫描。
例子:

   UPDATE   employees
      SET   job_id = ‘SA_MAN‘, salary = salary + 1000, department_id = 140
    WHERE   last_name = ‘Jones‘
RETURNING   salary * 0.25, last_name, department_id
     INTO   :bnd1, :bnd2, :bnd3;

如果修改的是多行记录,则returning clause返回到数组变量中。

三、 multitable insert



一句sql包含多条insert的写法。相比于多句insert语句,前者只需扫描源table一次,而后者要扫描多次。这在数据量很大的情况下性能差别非常大。Multitable insert可分为conditional(有条件的),unconditional,insert all(执行所有insert),insert first(只执行第一个满足条件的insert)等不同用法
有时候表里面一行记录包含了多类信息,如某一话单表中包含了一个设备多种话务类型的费用,这种表我们称为非关系表。下面例子应用oracle multitable insert技术将非关系表转换为关系型表。
create table test_table (id1 number,val_1 number,id2 number,val_2 number); --非关系表
insert into test_table values(1,101,1,202);
insert into test_table values(6,666,7,777);

--基表
create table id_type (a number);
insert into id_type values(1);
insert into id_type values(2);
insert into id_type values(3);
--目标表(将非关系表转换为两张关系表)
create table id1_table (id number,val number);
create table id2_table (id number,val number);

--普通方法,用多条insert语句
insert INTO id1_table select id1,val1 from test_table;
insert INTO id2_table select id2,val2 from test_table;

--用multiple insert,将非关系型表数据一条记录拆成两条,分别插入两张目标表
insert all
INTO id1_table values(id1,val_1)
INTO id2_table values(id2,val_2)
select id1,val_1,id2,val_2 from test_table;

--有判断条件的multiple insert
insert all
WHEN id1 =1 then
INTO id1_table values(id1,val_1)
when ID2 =5 then
INTO id2_table values(id2,val_2)
select id1,val_1,id2,val_2 from test_table;

--multiple insert还有更复杂的写法,判断条件可以用子查询
insert all
WHEN id1 in(select a from id_type) then
INTO id1_table values(id1,val_1)
when ID2 in(select a from id_type) then
INTO id2_table values(id2,val_2)
select id1,val_1,id2,val_2 from test_table;

参考: luw 百度文库资料

时间: 2024-10-09 14:52:43

PLSQL_性能优化系列13_Oracle DataScan的相关文章

PLSQL_性能优化系列16_Oracle DataScan数据扫描

对数据的读取操作是非常消耗资源的,如何减少对数据的扫描,是提升sql效率的一个重要方面,例如物化视图技术.本篇介绍几种sql写法,分别是CASE expression/DML with returning clause /multitable insert.[@[email protected]] 一. 用CASE EXPRESSION将多句查询组合在一起SELECT COUNT (*)FROM employeesWHERE salary < 2000;SELECT COUNT (*)FROM

PLSQL_性能优化系列13_Oracle Index Rebuild索引重建

2014-10-04 BaoXinjian 一.摘要 索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引.近来Oracle也提出了一些与之相反的观点,就是强烈建议不要定期重建索引.本文是参考了1525787.1并进行相应描述. 1. 重建索引的理由 Oracle的B树索引随着时间的推移变得不平衡(误解) 索

PLSQL_性能优化系列01_Oracle Index索引

2014-06-01 BaoXinjian 一.摘要 在PLSQL查询优化中,使用和接触最多的应该是索引Index这个概念,个人也觉得对Index选择和优化是程式优化过程中比较重要的概念,特别是刚开始接触PLSQL性能优化 索引的一些概念 一个索引可以由一个或多个列组成, 对列设置索引其实就是对列的内容按一定的方式进行排序,检索数据的时候,检索排过序的数据,检索到最后一个有效数据之后就跳出检索 这样就不必进行全表扫描了,同时可以应用很多算法提高检索效率 数据库多用二分法检索数据 索引的连接方式

PLSQL_性能优化系列04_Oracle Optimizer优化器

2014-09-25 BaoXinjian 一.摘要 1. Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. 2. RBO优化器 RBO是一种基于规则的优化器,随着CBO优化器的逐步发展和完善,在最新的10g版本中Oracle已经彻底废除了RBO. 正在使用Oracle8i或9i的人们或多或少的都会碰到RBO,因此在详细介绍CBO之前,我们有必要简单回顾一下古

PLSQL_性能优化系列08_Oracle Insert / Direct Insert性能优化

2014-09-25 BaoXinjian 一.Insert 性能影响 应用设计不合理导致的session之间的互锁(enqueue)是影响程序可扩展性最常见的原因.此外,一些共享资源的争用,也会导致性能下降. 本篇介绍两个由并发insert操作导致的等待事件(wait event),以及如何通过优化物理设计来进行改善. 普通Insert操作本身产生的是行锁,因此进程相互之间不会锁住(enqueue),但当很多进程insert同一张表时,会有资源上冲突. 以下是两个例子: 1. Buffer b

PLSQL_性能优化系列06_Oracle Soft Parse / Hard Parse软硬解析

2014-08-11 BaoXinjian 一.摘要 Oracle硬解析和软解析是我们经常遇到的问题,所以需要考虑何时产生软解析何时产生硬解析,如何判断 1. SQL的执行过程 当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析. 通常情况下,SQL语句的执行过程如下: Step1. SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限). Step2. 将SQL代码的文本进行哈希得到哈希值. Step3. 如果共享

PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量

2014-09-25 BaoXinjian 一.绑定变量用法和使用场合 使用绑定变量的重要性:如果不使用绑定变量而使用常量,会导致大量硬解析.由于硬解析的种种危害,不使用绑定变量往往是影响oracle性能和扩展性的最大问题 以下为一些错误写法和正确写法的例子 1. PLSQL中普通查询 (1). 错误写法 SELECT * FROM emp WHERE empno=123; (2). 正确写法(未使用绑定变量) Empno:=123;SEELCT* FROM emp WHERE empno=:e

PLSQL_性能优化系列02_Oracle Join关联

2014-09-25 BaoXinjian 一.摘要 Oracle三种主要连接方式的比较 1. Hash Join (1).概述 i. 读取一个表的资料,并将放置到内存中,并建立唯一关键字的位图索引 ii. 读取另一个表,和内存中表通过Hash算法进行比较 (2).适用对象 i. 大表连接小表 ii. 两个大表 2. Nested Loops (1).概述 i. 循环外表记录 ii. 进行逐个比对和内标的连接是否符合条件 (2).适用对象 小表驱动大表,返回较少的结果集 3. Merge Joi

PLSQL_性能优化系列05_Oracle Hint提示

2014-06-20 BaoXinjian 一.摘要 手工指定SQL语句的执行计划 尽管oracle优化器很智能,但有时候你想自己选择执行计划,可以通过hint实现.在开发测试环境中,可以通过hint测试不同执行计划的性能. Hint的缺点是增加了管理代码的额外负担,当数据库或环境发生变化时,如果不修改hint,可能导致性能下降.例如,代码中用hint指定索引,但重建索引时索引名变化. 因此oracle建议使用hint测试性能后,用其他工具来管理执行计划,如oracle 10g以后的sql tu