利用维对象来优化数据仓库的高级技巧

本文通过具体实例展示了如何使用Oracle OLAP中的维对象优化数据仓库查询。通过创建维护表、事实表及实体化视图,并结合查询重写技术,演示了维对象如何帮助提升季度和年度汇总查询的性能。

利用对象来优化数据仓库的高级技巧

    在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      

ASQL> SELECT /*+ all_rows */ D.F_YEAR,
    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_YEAR
    7 /

Execute Plan
SQLPLAN                                                      COST CARD KBYTE PS PE
------------------------------------------------------------ ---- ---- ----- -- --
  0     SELECT STATEMENT Optimizer=HINT: ALL_ROWS              10    4     0      
  1   0   HASH (GROUP BY)                                      10    4     0      
  2   1     HASH JOIN                                           9   97     6      
  3   2       MAT_VIEW REWRITE ACCESS (FULL) OF MV_FACT_S...    3   34     2      
  4   2       VIEW OF                                           5   97     1      
  5   4         HASH (UNIQUE)                                   5   97     1      
  6   5           TABLE ACCESS (FULL) OF TIME_DIM (TABLE)       4  999    11      

    我不太会用语言表解说, 因此设计了这个实例来说明, 如果看不懂, 请多看几次吧.

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解非平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值