Archive for oracle 11g 新特性

>Oracle11g新特性_Pivot 和Unpivot

>

我从Oracle 数据库 11g: 面向 DBA 和开发人员的重要新特性
http://www.oracle.com/technology/global/cn/pub/articles/oracle-database-11g-top-features/index.html
测试了一些个人觉得对日常工作有用的特性进行测试。
需要详细信息请猛击上方链接或者查阅相关文档。

3.Pivot为SQL语言增添了一个非常重要且实用的功能。

  可以使用pivot函数针对任何关系表创建一个交叉表报表,

  而不必编写包含大量decode函数的令人费解的、不直观的代码。

  同样,您可以使用unpivot操作转换任何交叉表报表,以常规关系表的形式对其进行存储。

CREATE TABLE CUSTOMER

(

CUST_ID              NUMBER(10),

CUST_NAME            VARCHAR2(20),

STATE_CODE           VARCHAR2(20),

TIMES_PURCHASED      NUMBER(3)

) nologging

;

insert into customer(cust_id,cust_name,state_code,times_purchased) values

(1,’sfsf’,'beijing’,1);

insert into customer(cust_id,cust_name,state_code,times_purchased) values

(2,’test’,'beijing’,3);

insert into customer(cust_id,cust_name,state_code,times_purchased) values

(3,’ayyt’,'beijing’,1);

insert into customer(cust_id,cust_name,state_code,times_purchased) values

(4,’bird’,'tianjin’,1);

insert into customer(cust_id,cust_name,state_code,times_purchased) values

(5,’call’,'shanghai’,1);

insert into customer(cust_id,cust_name,state_code,times_purchased) values

(6,’dogr’,'shanghai’,4);

insert into customer(cust_id,cust_name,state_code,times_purchased) values

(7,’elly’,'chongqing’,1);

insert into customer(cust_id,cust_name,state_code,times_purchased) values

(8,’febr’,'chongqing’,1);

commit;

想得到如下结果:

. TIMES_PURCHASED  ‘beijing’  ‘tianjin’  ‘shanghai’  ‘chongqing’

—————    ———- ———- ———-  ———-

              1      2           1          1          2    

              3      1           0          0          0    

              4      0           0          1          0

在11g之前的sql写法为:

SELECT t.times_purchased,

       SUM(decode(t.state_code,

                  ‘beijing’,

                  1,

                  ’0′)) AS beijing,

       SUM(decode(t.state_code,

                  ‘tianjin’,

                  1,

                  ’0′)) AS beijing,

       SUM(decode(t.state_code,

                  ‘shanghai’,

                  1,

                  ’0′)) AS beijing,

       SUM(decode(t.state_code,

                  ‘chongqing’,

                  1,

                  ’0′)) AS beijing

  FROM customer t

GROUP BY t.times_purchased

ORDER BY t.times_purchased;

在11g中,可以用如下sql:

SELECT *

  FROM (SELECT times_purchased,

               state_code

          FROM customer t) pivot(COUNT(state_code) FOR state_code IN(‘beijing’,

                                                                     ‘tianjin’,

                                                                     ‘shanghai’,

                                                                     ‘chongqing’))

ORDER BY times_purchased

pivot 的反向操作 UNPIVOT,将列打乱变为行。

Comments

>Oracle11g新特性_并行DBMS_PARALLEL_EXECUTE

>

我从Oracle 数据库 11g: 面向 DBA 和开发人员的重要新特性
http://www.oracle.com/technology/global/cn/pub/articles/oracle-database-11g-top-features/index.html
测试了一些个人觉得对日常工作有用的特性进行测试。
需要详细信息请猛击上方链接或者查阅相关文档。

2.并行DBMS_PARALLEL_EXECUTE

  这个新特性引入一个Package:DBMS_PARALLEL_EXECUTE,

  通过这个包可以将一个任务调度为并行,而此前我们需要手工来编写程序,

  通过rowid或者主键还分割,用11gR2,这个工作能简化很多。

  根据测试,oracle是提交job来实现并行,和咱们实现的方式一样。

  官方文档推荐这种做法用作大数据量的更新。

  create table TEMP_ZHJ_20101022 nologging as

    select * from user_objects;

  insert into temp_zhj_20101022 select * from user_objects;

  commit;

  DECLARE

    l_sql_stmt VARCHAR2(1000);

    l_try      NUMBER;

    l_status   NUMBER;

  BEGIN

    — Create the TASK

    dbms_parallel_execute.create_task(‘mytask’);

    — Chunk the table by ROWID

    dbms_parallel_execute.create_chunks_by_rowid(‘mytask’,

                                                 ‘SYS’,

                                                 ‘TEMP_ZHJ_20101022′,

                                                 TRUE,

                                                 100);

    — Execute the DML in parallel

    l_sql_stmt := ‘update /*+ ROWID (dda) */ TEMP_ZHJ_20101022 e

  SET e.EDITION_NAME = ”ORACLE11G”

  WHERE rowid BETWEEN :start_id AND :end_id’;

    dbms_parallel_execute.run_task(‘mytask’,

                                   l_sql_stmt,

                                   dbms_sql.native,

                                   parallel_level => 10);

    — If there is an error, RESUME it for at most 2 times.

    l_try    := 0;

    l_status := dbms_parallel_execute.task_status(‘mytask’);

    WHILE (l_try < 2 AND l_status != dbms_parallel_execute.finished)

    LOOP

      l_try := l_try + 1;

      dbms_parallel_execute.resume_task(‘mytask’);

      l_status := dbms_parallel_execute.task_status(‘mytask’);

    END LOOP;

    — Done with processing; drop the task

    dbms_parallel_execute.drop_task(‘mytask’);

  END;

Comments

>Oracle11g新特性_分区表

>

我从Oracle 数据库 11g: 面向 DBA 和开发人员的重要新特性

http://www.oracle.com/technology/global/cn/pub/articles/oracle-database-11g-top-features/index.html

测试了一些个人觉得对日常工作有用的特性进行测试。

需要详细信息请猛击上方链接或者查阅相关文档。

1.分区表

a.间隔分区表

  创建的时候指定一个基本分区和间隔,插入数据时会自动生成其他的分区;

  这个感觉比较有用,咱们有很多按照天进行分区的表,用这个功能的话可以减少分区的

  维护工作量;

create table sales6

(

   sales_id    number,

   sales_dt    date

)

partition by range (sales_dt)

interval (numtoyminterval(1,’MONTH’))

(

   partition p0701 values less than (to_date(’2007-02-01′,’yyyy-mm-dd’))

);

注意子句:interval 后面跟着时间间隔。您在此处指示 Oracle 为每个月份创建一个时间间隔。您已经为 2007 年 1 月的数据创建了名为 p0701 的初始分区。现在,假设您插入了一条包括 2007 年 6 月数据的记录:

SQL> insert into sales6 values (1,’01-jun-07′);

1 row created.

Oracle 不会返回错误,而是成功执行该语句。那么这条记录将转向何处?p0701 分区不能包括该记录,我们没有为 2007 年 6 月定义分区。但此时,如果您检查该表的分区:

SQL> select partition_name, high_value

  2  from user_tab_partitions

  3  where table_name = ‘SALES6′;

PARTITION_NAME  HIGH_VALUE

————— —————————————————————-

P0701           TO_DATE(‘ 2007-02-01 00:00:00′, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_C

                ALENDAR=GREGORIA

SYS_P41         TO_DATE(‘ 2007-07-01 00:00:00′, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_C

                ALENDAR=GREGORIA

注意名为 SYS_P1、高值为 2007 年 7 月 1 日的分区,它最多可以容纳到 6 月底的数据。该分区是由 Oracle 动态创建的,并具有一个系统生成的名称。

现在,假设您输入一个小于最高值的值,如 2007 年 5 月 1 日。理想情况下,它应该具有自己的分区,因为您的分区时间间隔是一个月。

b.REF分区

  这个分区方案假设关联表能从相同的分区策略中受益,子表通过

  PK-FK(主键-外键)关系继承主表的策略,它不需要分区键存储在子表中,

  通过PARTITION BY REFERENCE关键字指定,子表继承主表的分区策略。

c.混合分区

  可用的混合分区类型:

  范围-哈希,范围-列表,范围-范围,列表-范围,列表-列表,列表-哈希

d.系统分区

  系统在插入数据时,自动指定数据的分区

Comments