IT技术江湖   操作系统   安全技术   平面设计   Web开发   数据库   互联网   搜索引擎   网络广告   
引擎技术江湖  BLOG  合作联系
本站
Google
IT技术江湖
首页>数据库>Oracle性能调优> 利用维对象来优化数据仓库的高级技巧
  • IT技术江湖
  • 利用维对象来优化数据仓库的高级技巧
    http://www.hack1st.com 来源: 2008-03-24 阅读: 评论

      在Oracle的数据仓库(OLAP)中,实体化视图(MVIEW),查询重写(Query Rewrite)和维(Dimension)是非常重要的优化手段,对于前两者我不想在这儿重复讲了,主要来体验一下维的作用。要发挥维的作用,还是需要用到前面两者,下面是我设计的只有一个维表的最简单的例子。数据库用户除了connect, resource外, 还要给予Query Rewrite,Create Materialized View,Create Dimension权限。

      1、创建一个维护表

    CREATE TABLE TIME_DIM
    AS
    SELECT TO_CHAR(SYSDATE+ROWNUM,'YYYY') F_YEAR,
    TO_CHAR(SYSDATE+ROWNUM,'YYYY-Q') F_QUATER,
    TO_CHAR(SYSDATE+ROWNUM,'YYYY-MM') F_MONTH,
    TRUNC(SYSDATE+ROWNUM,'DD') F_DAY
    FROM DBA_OBJECTS
    WHERE ROWNUM < 1000;
    ALTER TABLE TIME_DIM MODIFY F_YEAR NOT NULL;
    ALTER TABLE TIME_DIM MODIFY F_QUATER NOT NULL;
    ALTER TABLE TIME_DIM MODIFY F_MONTH NOT NULL;
    ALTER TABLE TIME_DIM MODIFY F_DAY NOT NULL;
    ALTER TABLE TIME_DIM ADD PRIMARY KEY (F_DAY);
      2、创建一个事实表

    CREATE TABLE FACT_SALES
    AS
    SELECT TRUNC(SYSDATE+ROWNUM,'DD') F_DAY,
    TRUNC(DBMS_RANDOM.VALUE * 10000,2) M_AMOUNT1,
    TRUNC(DBMS_RANDOM.VALUE * 10000,2) M_AMOUNT2
    FROM DBA_OBJECTS
    WHERE ROWNUM < 1000;
    -- Please execute the following insert multiple times
    INSERT INTO FACT_SALES
    SELECT F_DAY,
    TRUNC(DBMS_RANDOM.VALUE * 10000,2) M_AMOUNT1,
    TRUNC(DBMS_RANDOM.VALUE * 10000,2) M_AMOUNT2
    FROM FACT_SALES
    / 
    ALTER TABLE FACT_SALES MODIFY F_DAY NOT NULL;
    ALTER TABLE FACT_SALES ADD FOREIGN KEY (F_DAY) REFERENCES TIME_DIM(F_DAY);
      3、将数据按月份进行汇总生成中间表

    CREATE MATERIALIZED VIEW MV_FACT_SALES
    ENABLE QUERY REWRITE
    AS
    SELECT D.F_MONTH,
    SUM(F.M_AMOUNT1) M_AMOUNT1,
    SUM(F.M_AMOUNT2) M_AMOUNT2
    FROM TIME_DIM D, FACT_SALES F
    WHERE D.F_DAY = F.F_DAY
    GROUP BY D.F_MONTH
    /
      4、分析表, 并在会话级启用查询重写

    ANALYZE TABLE TIME_DIM COMPUTE STATISTICS;
    ANALYZE TABLE FACT_SALES COMPUTE STATISTICS;
    ANALYZE TABLE MV_FACT_SALES COMPUTE STATISTICS;
    ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;
    ALTER SESSION SET QUERY_REWRITE_INTEGRITY=TRUSTED;
      5、先来看一下按季汇总的SQL语句的执行计划, 理论上, 可以从按月的汇总中进一步汇总生成, 但这时去执行的话, Oracle并不能这样执行

    ASQL> SELECT D.F_QUATER,
    2    SUM(F.M_AMOUNT1) M_AMMOUNT1,
    3    SUM(F.M_AMOUNT2) M_AMMOUNT2
    4 FROM TIME_DIM D, FACT_SALES F
    5 WHERE D.F_DAY = F.F_DAY
    6 GROUP BY D.F_QUATER
    7 /
    Execute Plan
    SQLPLAN                         COST  CARD KBYTE PS PE
    -------------------------------------------------------- ---- ------ ----- -- --
    0   SELECT STATEMENT Optimizer=ALL_ROWS        626   12   1   
    1  0  HASH (GROUP BY)                 626   12   1   
    2  1   HASH JOIN                   609 287712 16858   
    3  2    TABLE ACCESS (FULL) OF TIME_DIM (TABLE)    4  999  13   
    4  2    TABLE ACCESS (FULL) OF FACT_SALES (TABLE)  602 287712 13206
      6、接下来来创建一个维对象, 用来告诉Oracle在TIME_DIM表的四个字段上存在的树状关系, 如果没有这个声明, Oracle会认为数据是不附合这个树状关系的

    CREATE DIMENSION TIME_DIM
    LEVEL YEAR IS (TIME_DIM.F_YEAR)
    LEVEL QUATER IS (TIME_DIM.F_QUATER)
    LEVEL MONTH IS (TIME_DIM.F_MONTH)
    LEVEL DAY IS (TIME_DIM.F_DAY)
    HIERARCHY Y_Q_M_D
    (
    DAY CHILD OF
    MONTH CHILD OF
    QUATER CHILD OF YEAR
    )
    HIERARCHY Y_M_D
    (
    DAY CHILD OF
    MONTH CHILD OF YEAR
    )
    /
      7、建好维后, 重新跑按季度汇总或按年汇总的SQL, 看他们的执行计划有什么不同?

    ASQL> SELECT D.F_QUATER,
    2    SUM(F.M_AMOUNT1) M_AMMOUNT1,
    3    SUM(F.M_AMOUNT2) M_AMMOUNT2
    4 FROM TIME_DIM D, FACT_SALES F
    5 WHERE D.F_DAY = F.F_DAY
    6 GROUP BY D.F_QUATER
    7 /
    Execute Plan
    SQLPLAN                           COST CARD KBYTE PS PE
    ----------------------------------------------------------- ---- ---- ----- -- --
    0   SELECT STATEMENT Optimizer=ALL_ROWS          10  12   1   
    1  0  HASH (GROUP BY)                   10  12   1   
    2  1   HASH JOIN                     9 289  17   
    3  2    MAT_VIEW REWRITE ACCESS (FULL) OF MV_FACT_...  3  34   2   
    4  2    VIEW OF                     5 289   4   
    5  4     HASH (UNIQUE)                 5 289   4   
    6  5      TABLE ACCESS (FULL) OF TIME_DIM (TABLE)   4 999  13   

    上一页12 下一页

    上一篇:保持Oracle数据优良性能的技巧  
    下一篇:没有了

    ·网友互动--用户名: (新注册) 密码: 匿名评论 [所有评论]
    评论内容:(用户发表意见仅代表其个人意见,评论内容与本站立场无关,请自觉遵守互联网相关政策法规)
    关注此文读者还看过
    • ·教你从应用程序来优化Oracle数据库
      ·教你从应用程序来优化Oracle数据库
      ·利用维对象来优化数据仓库的高级技巧
      ·保持Oracle数据优良性能的技巧
      ·Unix环境下的Oracle调优
      ·Oracle性能调优原则
      ·Oracle的优化器(Optimizer)
      ·优化调整Oracle 8i数据库
      ·SQL语句性能调整
      ·有关Oracle数据库中并行处理技术剖析
    最新更新
    • ·利用维对象来优化数据仓库的高级技巧
      ·保持Oracle数据优良性能的技巧
      ·Unix环境下的Oracle调优
      ·Oracle性能调优原则
      ·Oracle的优化器(Optimizer)
      ·优化调整Oracle 8i数据库
      ·SQL语句性能调整
      ·有关Oracle数据库中并行处理技术剖析
      ·清除Oracle中无用索引 改善DML性能
      ·调整Oracle应用系统性能的原则和方法
    文章关注度排行
    ·高速高效 创建物化视图提高查询速度
    ·Oracle数据库最优化参数缩短反应时间
    ·在Oracle 9i里基于函数的仅索引扫描
    ·提高Oracle数据库查询统计速度经验总结
    ·如何选择Oracle优化器
    ·Unix环境下的Oracle调优
    ·Oracle中建立索引并强制优化器使用
    ·Oracle的优化器(Optimizer)
    热点推荐
    如何选择Oracle优化器
    如何选择Oracle优化器
    频道推荐
    • ·如何选择Oracle优化器
    本站精华
    如何选择Oracle优化器
    如何选择Orac
    • ·如何选择Oracle优化器
    • | 网站导航 | 联系QQ | 编辑邮箱 | RSS订阅 | 友情链接 | 官方blog
    • 版权所有:IT技术江湖 @2007-2008
    • powered by www.hack1st.com online services. all rights reserved.京ICP备07005766号