存档

文章标签 ‘Oracle’

混合储存与压缩

2011年11月10日 没有评论

由于列数据库在IO 读取和磁盘利用率上有优势,所以各个行数据库也纷纷提出了自己的向列数据库过度的中间储存模型,即混合储存(Hybrid Column).

在商用的混合储存出现之前,就已经有论文说明了三种不同的储存方式, 行储存,列储存,混合PAX储存.

本文将介绍三种混合存储的方式: Oracle 的混合储存,Greenplum,AsterData,Teradata的混合储存, Vertica 的混合储存.

 

Oracle 11g Hybrid

Oracle 在09年7月左右推出Exadata 的时候推出的新压缩模式, 也是唯一一个最接近PAX 的压缩模式. 它将数据分为Compression Unit (简写CU), 一个CU 一般是一个Oracle 里面的extend 区块. 由16个Block 组成(可以配置大小), 然后在每个CU 的第一个Block 的头部放入压缩数值, 将所有的列中出现频率最高的数值放入Block 头部, 默认好像是只有在Oracle 自己的Exadata 里面才能用(为了赚钱嘛), 有两种压缩级别,压缩级别高的收益更小,压缩时间更长, 解压缩无影响. 如下图:

sshot-1

oracle 的混合压缩并不算是真正意义上的混合储存,它在读取数据的时候IO 并没有大幅减少, 它只是将更多的块放在一起提高了一点压缩率,它并不像其他的混合储存或者列储存得到的好处那么多.

阅读全文…

最权威调研机构对所有主流BI 平台调研报告

2009年3月8日 没有评论

如果你看到标题以为这是一篇标题党的文章,那你就要错过重要内容了.

收到olapreport 的一封邮件,说全世界最大的独立BI 调研机构Nigel Pendse 已经发表了它第8份针对全世界最大BI 平台的调研报告. Nigel Pendse 做BI 市场调研已经很多年了,最早的第一份BI 市场调研报告发表于2001年,现在已经是第8份了,世界500强超过一半都接受了调研,这次一共调研了2079个公司(这个数字够有说服力了吧),比去年略少79个,去年有2150个公司接受了调研,全世界最主流的23 款BI 平台都覆盖到了,并且它调研的最主要特点就是技术和用户第一。

它有非常详尽的各种技术比较,全部用客观数据说话,无任何主观论断. 新的报告引入了一种Customer Dashboard 的方式,对BI 平台的26个主要方面KPI 和8个聚合KPI 做全面分析,每一个BI 平台都覆盖到, 让你对每一个技术细节都全面了解 . 全文报告489页,已经放在www.bi-survey.com 上供用户购买,它提供一个8页的预览版可以免费下载,如果你对BI 很有兴趣的话,可以去看看这个报告.

在这8页的预览版中也提供了一些非常有技术含量的数据.

bi-survey-overview

总的用户满意度,一共2071个公司接受调研,分别为已经在使用,六个月内会使用,1年内会使用,2年内会使用,最终会使用和绝不会使用划分. 其中总的使用率只有16.4% ,意思是公司已经购买并建设好data warehouse了,但是在公司内部大范围使用率还是只有16.4%.

其中调研人数最多和使用人数最多的是microstrategy ,一共56个公司(248×22.6%) , microstrategy 的产品一向以易用性闻名,这也在很大程度上符合了这个说法,BI  产品还是要符合用户习惯,做到平民化,很显然microstrategy 深深的了解这一点.

而其他几个大的BI 平台的数据都表现可以, Cognos Reporting, BO , Crystal Reports , OBIEE/BISEO 都在部分领域各有所长.

但最让人惊喜的是Actuate 平台以56.4% 的满意率高居第一,在六个月内打算部署Actuate 的客户数甚至达到了64.1% , 比第二的InformationBuilder 公司的WebFocus 的33.7% 高出了一半,比其他大厂商SAP 的BO,IBM 的 Cognos,Oracle 的OBIEE , Microsoft 的Microsoft AS 高出了2.5倍-4倍,这足以证明Actuate 在易用性和各项技术比拼中拥有无可争议的压倒性优势.

 

如果说上面只是一个大体的统计表格,数据很显然不能让每个人信服,下面就是每一项技术指标的综合

bi-survey-overview2

这就是第八版的customer dashboard , 将所有用户的数据按照26个主KPI 和8个聚合KPI 进行统计, 主KPI 的技术标准包括:用户需求复杂度,满足用户需求满意度,竞争性,购买更多产品意愿,没有持续使用率,员工使用率,部署数,用户使用数,数据容量,管理员数,成功实施时间,产品可靠性,产品质量,性能,随容量增加的性能,随数据增长而产生的延迟等等,8个聚合KPI 技术标准包括:商业目标达成KPI , 费用,可伸缩性,质量和产品支持,性能,忠诚度,WEB 界面,所有KPI 汇总.

相信以如此详细的技术指标,如此大范围的调研,其专业性足可保证, 任何个人或公司想要反对都要拿出足够的数据.

而在上图中的汇总中,我们惊喜看到Actuate 在各项技术指标中,再一次以惊人的技术压倒性优势远远超过各方挑战者,Actuate 的3.44甚至快达到第二名的WebFocus 1.85的两倍了 , 而其他各大厂商的表现则只能够用及格来表达了, Cognos Report的1.23(它另外两款产品Cognos Analysis , TM1 Server 甚至没及格), Microstrategy 1.38 甚至还没有名气远不如它的Panorama NovaView 的1.49(没听过这个产品) , OBIEE 则只是刚刚及格的1.02. BO 的两款产品BO 和Crystal Report 分别得到1.22和1.06 (可惜这两款产品完全是不同的产品线)

Actuate 平台能够取得如此好的成绩,要有一半的功劳归功于其Open Source 的birt , 有四分之一功劳归功于Actuate BIRT Viewer,Report Studio,BIRT Designer Pro.  其纯Java 的架构,完全基于Web 的功能,简单易用而又功能丰富,清晰明确的API 等优势完全俘获了开发人员和最终用户, 难怪各大厂商纷纷都愿意与Actuate 合作,IBM ,Cisco , Zend 都在其商业产品中添加了birt 的报表功能,更加不用提开源界对birt 的广泛使用. 以前一直没有足够证据或说出来难免会让人认为是厂商自己的宣传. 现在以如此细的技术指标评价所有主流厂商, 相信是可以让每个人都信服的.

 

其他报告细节

另外报告中还提到了一些不是泛泛而谈的经验,用户的使用BI趋势,像是用户评估多个BI 产品会得到更好的成功率,大BI 提供商的服务比小的提供商要差很多, BI 的使用率其实还并不是很高,员工长期使用BI 工具并能够得到信息的并不多(8.3%), 软件费用不再是限制企业采用BI 的重要因素, 其中有很多可能是你在其他报告中都没有听到过的.

 

 

gartner 2008 bi platform

对比一下gartner 的调研报告,gartner 调研报告主要以公司的收入,合作伙伴和渠道商完成满意度占主体部分,数据更加抽象一些,强调的更多的是公司,而不是产品,Nigel Pendse  的调研报告则完全以产品为出发,以用户满意度为主.

 

社区

产品的发展,推广,在一定程度上都需要一个或以上的社区来支持,喜欢oracle 的人都知道oracle 在全世界有各种各样的社区,官方的社区otn 只是一部分程度上领导社区成员进行活动, 所以大家都喜欢学习oracle , 你能够在各种社区中得到资料和帮助, 像是国内的itpub , cnoug ,都是热闹的不得了. 而相对于各BI 厂商来说,社区的发展还很落后,民间的组织都是一些小的论坛,都没有聚集足够的人气,

Actuate 在birt-exchange 上已经在慢慢组织它的社区,各种技术资料都免费提供下载,论坛的提问也能够迅速的回答. eclipsecon , WJAX 等各种技术大会上也经常能够看到birt 的身影, 其社区的发展还是非常迅速的. 但是不得不批评一下其中国Actuatechina 的社区发展,垃圾留言没有人管理,简单的提问不回答或是要求其购买商业技术支持服务,这绝对不应该在一个世界级技术性BI领导公司看到,当然actuatechina 还是为open source 作出了很多贡献的,birt 的大部分开发工作, eclipse 在大陆地区唯一的下载服务器镜像点, 希望其今后能够更好的领导社区的发展. 作出世界级BI 领导公司的架势, 而不要入乡随俗的跟国内二三流公司一样.

 

如果哪个公司购买了这份报告,记得借我瞄一眼!!!!!!

参考资料

http://www.bi-survey.com/

Nigel Pendse  的主页,要下载其预览版报告需要注册

 

http://www.olapreport.com/

一个独立的BI 调研机构

分类: BI 标签: , ,

Oracle OLAP 使用mv 刷新Cube

2009年3月7日 没有评论

上一篇文章中介绍了oracle 11g 中的部分olap 新功能,这篇介绍如何使用mv 刷新cube 的数据.

默认的如果你创建了一个cube ,cube 里面的数据只有在你手工执行

dbms_cube.build(‘<cube_name>’) 才会刷新.

 

比如你在前面已经建立好了global 的price_cube , 并且执行了第一次dbms_cube.build(‘price_cube’) 你才能查询到数据. 比如执行以下sql:

select * from table(cube_table(‘price_cube’))

where product=’ITEM_ENVY STD’  and time=’MONTH_1998.01′;

此时输出如下 (注意大小写,下划线和空格):

unit_cost    unit_price    time                        product

3346.85     3480.92       MONTH_1998.01     ITEM_ENVY STD

现在我们手工更新price_fact 表的这条数据(price_cube 的实际数据来源),

update price_fact set unit_price=9999

where month_id=1998.01 and item_id=’ENVY STD’;

1 rows updated

现在重新查看price_cube 的数据,你会发现跟刚才的一样, unit_price 还是等于3480.92 , 而不是随着price_fact 表的数据更新到9999.

 

启用Cube MV  刷新数据的前提条件

如果你希望你的cube 随着实体表的更新而刷新的话(不一定要是同步), 你就需要把cube 设置成按mv 方式来组织. 不过首先你需要满足以下几个条件:

  1. 所有的dimension 必须至少有一个level 和 hierarchy
  2. 所有的dimension 必须使用同一种聚合操作, sum,min,max 等等.
  3. 一个cube 的所有属性必须正确的映射到实体表. 一个cube 可以有calculated measures , 但是不能映射到mv , 如果一个cube 的脚本中有高级分析函数也不能映射.
  4. dimension 和fact table 之间必须要有约束.至少是外键约束. 如果你没有定义,你可以在启用mv 的时候用Relational Schema Advisor 帮你映射.
  5. 所有的表上的约束必须同一类型.
  6. cube 被压缩了.
  7. 为了更好的使用query rewrite , 你应该创建relational dimension 对象
    关于第二点,otn 上给的global_schema 的price_cube 的聚合操作就不是同一的sum 操作,所以你启用mv 刷新的时候会报错,注意根据错误信息调整.
    关于第三点, calculated measure 支持的分析函数:
    awm_calculated_measure_advanced_analysis
    除了在第一个文件夹 简单算术 文件夹下的六个(+,-,×,/,%) , 其他都算高级分析函数.
    关于第四点,fact table 和dimension table 之间至少要有外键约束, 这应该是建模标准之一,如果不是多维数据集 比如11g 之前的类型,你可以方便的在外键之间建立组合索引. 对于11g 的cube 类型来说,必须需要至少外键约束.
    关于第六点,默认的用awm 创建的cube 里面的是没有指定压缩类型和压缩比率的,只有在第一次刷新之后,再启用mv 刷新的时候才能选择压缩选项. awm 里面有提示,注意参考提示信息.
    关于第七点最重要, 所谓relational dimension 就是我们通过create dimension 创建的对象. 而我们之前说的dimension 一般都是指cube dimension , 它指的是在analysis workspace 里面的dimension 对象.

relational dimension 你可以通过查看dba_dimensions 视图查看. 主要用来控制mv query rewrite 的.

cube dimension 可以通过查看dba_cube_dimensions 视图查看. 另外两个跟aw 相关的视图是dba_cubes 和dba_aws ,

11g 有一些新的跟aw 相关的试图,你可以查看

SELECT * FROM dba_objects WHERE object_name LIKE ‘%AW%’;

其中包括了dimension 和cube 的元数据,dimension 和cube 的统计图信息(analyze 之后收集的),  dimension 和cube mv 的元数据, cube 的分区建议和储存建议. 具体查看oracle 11g 的文档.

默认的你创建cube 的时候,它会创建对应的relational dimension (awm 里面是这样, 手工从pl/sql 里面创建没试过), 你可以删除relational dimension , cube 里面的dimension 是不会跟着删除的.

 

relational dimension的一些操作

查看dimension 的pl/sql

exec dbms_dimension.describe_dimension('global.product_dimension');

输出:


DIMENSION GLOBAL.PRODUCT_DIMENSION  LEVEL FAMILY IS GLOBAL.PRODUCT_DIM.FAMILY_ID  LEVEL ITEM IS GLOBAL.PRODUCT_DIM.ITEM_ID
LEVEL TOTAL IS GLOBAL.PRODUCT_DIM.TOTAL_ID
LEVEL class IS GLOBAL.PRODUCT_DIM.CLASS_ID
HIERARCHY primary ( ITEM CHILD OF
FAMILY CHILD OF
class CHILD OF
TOTAL
)
ATTRIBUTE FAMILY LEVEL FAMILY DETERMINES GLOBAL.PRODUCT_DIM.FAMILY_DSC
ATTRIBUTE ITEM LEVEL ITEM DETERMINES GLOBAL.PRODUCT_DIM.ITEM_DSC
ATTRIBUTE TOTAL LEVEL TOTAL DETERMINES GLOBAL.PRODUCT_DIM.TOTAL_DSC
ATTRIBUTE class LEVEL class DETERMINES GLOBAL.PRODUCT_DIM.CLASS_DSC

 

启用cube mv 刷新

实际启用cube mv 刷新是很简单的, 主要是前提条件都满足了, 在awm 的cube 里面Materialized Views 选项卡里面点击 Enable Materalized View 选项和 Enable Query Rewrite 选项.

image

刷新模式有Complete , Fast ,Force . 其他可选方法还有PCT (Partition Change Tracking) 和Fast Solve;

1. Complete – 全部删除再全部装载

2. Fast – 使用mv log 记录变化的记录,并且只更新这些记录和对应的聚合记录

3. Force-  默认使用fast, 如果fast 不可用,才使用complete

4. Partition Change Tracking:  只刷新部分分区的数据,这在awm 里面没有

5. Fast Solve:  加载所有的原始数据,但是只计算新数据的聚合值,awm 里面没有

 

mv 不会计算calculated measures , 并且随着mv 的体积增大,创建和刷新的速度会变慢(不是呈线性下降),如果你mv 过大,你应该考虑分割成几个sub cube , 或者去掉一些不用的属性.

你选择使用mv 来刷新数据之后,oracle 会为每一个dimension 的每个hierarchy 都创建一个mv , 并且mv 的名字都是以CB$ 开头, 你是不能控制这些mv 的,只能控制cube . 以下的sql 可以得到所有的cube 对应的mv

 

启用Query Rewrite

要使用query rewrite 必须满足以下条件:

要有create mv 权限和其他相关对象的权限,

  1. 在init.ora 文件中设置QUERY_REWRITE_ENABLED= TRUE 或FORCE , 在session 里面也可以.
  2. 注意awm 里面的检查信息.
  3. 注意查看Relational Schema Advisor ,注意这很重要,Relational Schema Advisor 在mv 选项卡的最下面,上图中最下面那个灰色的按钮. 里面会列出你的schema 不符合query rewrite 的条件. 它会给出sql 让你执行,注意查看这些sql 以避免query rewrite 失败.

你也可能会想要改变约束类型, 从enforced , trusted , norely 到‘RELY’ 因为oracle执行计划消耗会更小

alter table "price_fact" add constraint "xxx_constraint" PRIMARY KEY (ITEM_ID, MONTH_ID, UNIT_PRICE, UNIT_COST) RELY enable validate ;

 

刷新MV

刷新时间点上有三种方式:

on demand , 等待手工刷新

start next ,  定时到将来刷新

on commit ,  每次源表有提交都刷新.

 

推荐的维护mv 刷新还是使用awm , 如果是定时的话就使用下面一些pl/sql.

exec dbms_cube.build(‘PRICE_CUBE’);   — 这是全刷新

可以一句话包含多个cube 或dimension , exec dbms_cube.build(‘PRICE_CUBE, xxx_CUBE , xxx_dimension’);

刷新mv:

exec dbms_mview.refresh(‘CB$PRODUCT_PRIMARY’,'C’);

C 当然是代表complete , 这会刷新所有跟这个dimension 的这个hierarchy 有关的mv

或者exec dbms_mview.refresh(‘CB$PRICE_CUBE’,'F’) 这会以force 方式刷新这个cube 的它对应的mv.

你可以说使用以下sql 查看mv 的状态:

select owner||’.'||mview_name cube_mv, rewrite_enabled, staleness

         from all_mviews

         where container_name like ‘CB$%’;

Staleness 这一栏下有fresh 和stale 两种状态,fresh 表示所有数据都已经最新了, stale 表示有新的数据没有刷新但是mv 仍然可用.

 

MV 的一些注意事项

如果query rewrite 没有使用mv , 则检查:

query_rewrite_enabled =FORCE

query_rewrite_integrity=stale_tolerated

使用dbms_mview.explain_rewrite 查看为什么query rewrite 没有成功.

 

参考资料:

http://www.oracle.com/technology/products/bi/olap/collateral/OLAP_11g_MV_query_rewrite.html?_template=/ocom/print

介绍oracle 11g mv 的

 

http://www.oracle.com/technology/obe/obe10gdb/bidw/mvplans/mvplans.htm

介绍oracle 10g mv 的.

分类: OLAP, Oracle 标签: , , ,

Oracle 11g OLAP 新功能简介

2009年3月5日 1 条评论

oracle 11g 在数据仓库方面也有不少新功能,尤其是新的多维数据集组织的cube (也就是常说的MOLAP).

在开始本文之前,建议先查看otn 上关于介绍oracle 11g 新功能的data warehouse 部分,由oracle ace 总监Arup Nanda 写的, 目前otn 的中文站点已经有翻译版的, 地址如下:

http://www.oracle.com/technology/global/cn/pub/articles/oracle-database-11g-top-features/11g-dw-olap.html?_template=/ocom/print

这篇文章主要介绍上面这篇文章中的一些实验和没有覆盖到的地方. (记住一定先看上面这篇文章)

 

导入数据

首先从http://www.oracle.com/technology/products/bi/olap/doc_sample_schemas/global_11g_schema.zip

下载它的示例数据, 之后使用一个具有DBA 权限的用户建立global 用户,用户名一定要是global (除非你修改里面的一些脚本), 执行

SQL&gt; @global_11g_install

它会要求你输入system 的密码和你希望global 用户的密码

之后就会导入global schema . 一共8个表,默认应该是成功并且没有警告的.

不要执行第二个脚本 global_11g_create_cubes.sql, 虽然它global_11g_readme.html 说明里说要执行第二个脚本,但这个脚本有问题,会失败. 执行了也没关系.

使用AWM

伴随oracle 11g 发布的还有一个AWM (Analysis Workspace Manager) 工具,版本为11.1.0.7 ,  这是个JAVA 工具,需要JDK 5.0 以上, 你可以到下面地址下载:

http://www.oracle.com/technology/global/cn/products/bi/olap/index.html

oracle 11g 引入了 分析工作区 (aw) 来管理跟OLAP 有关的对象, 而awm 就是一个图形化的用来管理aw 的工具.

解压awm 之后, 在命令行下执行

java –jar awm11.1.0.7.0B.jar

awm 启动后,点击 File –> Connect Database , 选Global 作为你要连接的数据库,输入刚才输入的global 用户名和密码. 之后打开分析工作区 , 你应该看到global 工作分析区下面有dimensions , cubes 文件夹,你点开后里面应该是空的(otn 的示例上有是因为执行了上面第二个脚本,但是它给出的下载的文件里这个脚本有问题而没有执行,所以应该是空的).

现在可以导入dimension 和cube 的定义,右键点击Dimension 文件夹,选择 从模板创建 , 然后倒入CHANNEL , CUSTOMER , PRODUCT , TIME dimension , 文件就在global_schema 文件夹下的templates 下, 对cube 也执行一样的操作导入PRICE_CUBE 和 UNIT_CUBE .

 

填充Cube 数据

完成上面操作之后,你应该有了4个dimension 和2个cube , 但是里面都没有数据,你可以使用两种方法从table 里面导入数据,

1. 用pl/sql  , 在sqlplus 里面使用 exec dbms_cube.build(‘PRICE_CUBE’) ;

2, 还是使用awm , 在awm 的cube 文件夹下的PRICE_CUBE 上点右键,选择 维护立方体 .

image

    awm 会让你选择维护的cube 和dimension , 点击Next 之后,再选择 立即运行 , 如果你想看运行的到底是什么,你可以选择保存文件.

image

之后你可以在Build log 对话框里面查看Output 列,

<CommandOutput>
<CubeLoad
Name="MAP1"
SQL="SELECT /*+  bypass_recursive_check  cursor_sharing_exact  no_expand */
  T16_MONTH_ID ALIAS_114,
  T13_ITEM_ID ALIAS_115,
  SUM(T19_UNIT_PRICE)  ALIAS_116,
  SUM(T19_UNIT_COST)  ALIAS_117
FROM
  (
  SELECT
    T1.ITEM_ID T19_ITEM_ID,
    T1.MONTH_ID T19_MONTH_ID,
    T1.UNIT_PRICE T19_UNIT_PRICE,
    T1.UNIT_COST T19_UNIT_COST
  FROM
    GLOBAL.PRICE_FACT T1   )
  T19,
  (
  SELECT
    T1.MONTH_ID T16_MONTH_ID
  FROM
    GLOBAL.TIME_DIM T1   )
  T16,
  (
  SELECT
    T1.ITEM_ID T13_ITEM_ID
  FROM
    GLOBAL.PRODUCT_DIM T1   )
  T13
WHERE
  ((T16_MONTH_ID = T19_MONTH_ID)
    AND (T13_ITEM_ID = T19_ITEM_ID)
    AND (T16_MONTH_ID = T19_MONTH_ID)
    AND (T13_ITEM_ID = T19_ITEM_ID) )
GROUP BY
  (T13_ITEM_ID, T16_MONTH_ID)
ORDER BY
  T13_ITEM_ID ASC NULLS LAST ,
  T16_MONTH_ID ASC NULLS LAST "
LOADED="2523"
REJECTED="0"
</CommandOutput>

完成之后你就可以看到cube 里面的数据了.

 

查看数据

Oracle 11 g引入一个新的函数cube_table 让我们使用sql 的语法就可以查看到MOLAP 的数据,语法如下

cube 语法: select * from table(cube_table(‘<schema>.<cube_name>’))

示例 PRICE_CUBE : select * from table(cube_table(‘GLOBAL.PRICE_CUBE’))  (如果你是global 登录的,可以不加前面的global.)

dimension 语法: select * from table(cube_table(‘<schema>.<dimension>;<hierarchy>’))

其中hierarchy 部分是可选的, 比如对于global 用户的product dimension:

select * from table(cube_table(‘global.product’));

如果dimension 只有一个hierarchy ,oracle 当然会选择这个,如果dimension 有两个或两个以上的hierarchy , oracle 使用的就是你指定的默认的那个, time dimension 就有CALENDAR 和FISCAL 两个hierarchy , calendar 就是默认的那个,所以你查询time dimension 时没有指定hierarchy , 实际就是查询的calendar hierarchy.

对于每一个cube 和dimension ,oracle 都会创建相应的view , 所以你查询cube 和 dimension 的时候,也是查询的对应的view.

比如global schema 就会默认的创建下面这些view (在你建立cube 的时候) : product_view , product_parmary_view , time_view , time_calendar_view, time_fiscal_view , price_cube_view.

每个dimension 会默认创建 <dimension_name>_view 和 <dimension_name>_<hierarchy_name>_view , cube 则会对应 <cube_name>_cube_view

所以你执行select * from table(cube_table(xxx)); 的时候实际上就是查询的view

比如其中price_cube_view 的定义就是如下:

1
<p>&#160; CREATE OR REPLACE FORCE VIEW &quot;GLOBAL&quot;.&quot;PRICE_CUBE_VIEW&quot; (&quot;UNIT_COST&quot;, &quot;UNIT_PRICE&quot;, &quot;TIME&quot;, &quot;PRODUCT&quot;) AS   <br />&#160; SELECT   <br />&#160;&#160;&#160; &quot;UNIT_COST&quot;,  <br />&#160;&#160;&#160; &quot;UNIT_PRICE&quot;,&#160;&#160;&#160;&#160; </p><p>    &quot;TIME&quot;,&#160;&#160;&#160;&#160; </p><p>    &quot;PRODUCT&quot;&#160;&#160; FROM TABLE(CUBE_TABLE('GLOBAL.PRICE_CUBE') ) ;</p>

 

cube 的过滤,排序和聚合

更复杂一点的sql:

SELECT * FROM TABLE(CUBE_TABLE(

   ‘global.price_cube HIERARCHY product primary HIERARCHY time calendar’))

   where TIME=’TOTAL_TOTAL’

   ORDER BY PRODUCT  
   ;

 

SELECT SUM(UNIT_COST),SUM(UNIT_PRICE),PRODUCT  FROM TABLE(CUBE_TABLE(

   ‘global.price_cube HIERARCHY product primary HIERARCHY time calendar’))

   where TIME=’TOTAL_TOTAL’  
   GROUP BY PRODUCT

   ORDER BY PRODUCT  
   ;

 

跟普通的sql 基本一样,除了cube_table 里面的写法需要注意一点外, 如果你喜欢通过GUI 界面来看的话,awm 里面右键点击cube 选查看数据.  还可以点击维度展开 , 下面还有图表.

awm_view_cube_data

在查讯构建器里面(上图中 文件 菜单那个下面那个按钮)还可以选择构建复杂的.

awm_query_build

这个界面倒是跟owb 里面的完全一样,估计用的同一代码

owb_sshot-6

最原始的模型应该是从essbase 借鉴过来的,界面布局和操作方式都跟essbase 非常像.

 

 

如何管理cube

并没有直接的pl/sql 可以来删除或者修改cube , 目前dbms_cube 包里面就三个函数 build() , import_xml , validate_xml().  build() 是用来填充数据的 . 如果你对cube 的定义不满意的话,要修改或者删除的话,一般都是通过awm ,  otn 上面给出的那个global_schema 文件里倒是有一个删除的例子,手工拼接xml , 然后dbms_cube.import(xml).

  set serverout on

  declare      xmlCLOB   clob;      v_i       number;      type t_dims is table of all_cube_dimensions%rowtype;      type t_cubes is table of all_cubes%rowtype;      v_dims    t_dims;      v_cubes   t_cubes;      v_cmd     varchar2(400);    

  begin      -- Check if the AW exists
    dbms_output.put_line('... checking for GLOBAL AW in GLOBAL schema');     SELECT COUNT(*)      INTO v_i     FROM all_aws     WHERE owner = 'GLOBAL'      AND aw_name = 'GLOBAL';


    -- Delete the AW if it exists     if v_i > 0 then       dbms_output.put_line('... deleting GLOBAL AW in GLOBAL schema');        dbms_lob.createtemporary(xmlCLOB,TRUE);        dbms_lob.open(xmlCLOB, DBMS_LOB.LOB_READWRITE);        dbms_lob.writeappend(xmlCLOB, 9, '<Metadata');        dbms_lob.writeappend(xmlCLOB, 16, '  Version="1.1">');        dbms_lob.writeappend(xmlCLOB, 5, '  <AW');        dbms_lob.writeappend(xmlCLOB, 19, '    Action="REMOVE"');        dbms_lob.writeappend(xmlCLOB, 18, '    Owner="GLOBAL"');        dbms_lob.writeappend(xmlCLOB, 19, '    Name="GLOBAL"/>');        -- Loop over each of the Dimensions in the AW and delete them        select *  bulk collect  into v_dims   from all_cube_dimensions        where owner = 'GLOBAL'  and aw_name = 'GLOBAL';
        for i in 1 .. v_dims.count loop          v_cmd := '<' || initcap(v_dims(i).dimension_type) || 'Dimension';          dbms_lob.writeappend(xmlCLOB, length(v_cmd), v_cmd);        dbms_lob.writeappend(xmlCLOB, 19, '    Action="REMOVE"');        dbms_lob.writeappend(xmlCLOB, 18, '    Owner="GLOBAL"');         v_cmd := '    Name="' || v_dims(i).dimension_name || '"/>';         dbms_lob.writeappend(xmlCLOB, length(v_cmd), v_cmd);              end loop; 

     -- Loop over each of the cubes and delete them
        select * bulk collect into v_cubes         from all_cubes        where owner = 'GLOBAL'          and aw_name = 'GLOBAL';        for i in 1 .. v_cubes.count loop          dbms_lob.writeappend(xmlCLOB, 7, '  <Cube');        dbms_lob.writeappend(xmlCLOB, 19, '    Action="REMOVE"');          dbms_lob.writeappend(xmlCLOB, 18, '    Owner="GLOBAL"');         v_cmd := '    Name="' || v_cubes(i).cube_name || '"/>';                      dbms_lob.writeappend(xmlCLOB, length(v_cmd), v_cmd);       end loop;            -- Finish off the removal tags
        dbms_lob.writeappend(xmlCLOB, 11, '</Metadata>');            dbms_lob.close(xmlCLOB);            dbms_output.put_line(xmlCLOB);       --  dbms_cube.import_xml(xmlCLOB);       commit;     else       dbms_output.put_line('... GLOBAL AW in GLOBAL schema not found');     end if;     exception       when others then         dbms_output.put_line(' ');         dbms_output.put_line('# ERROR:  Installation failed.');         dbms_output.put_line('# Please ensure that the analytic workspace GLOBAL is not currently open.');         raise_application_error(-20000, 'Can not delete analytic workspace that is currently in use.');
end;
/

我把dbms_cube.import_xml() 那一行注释掉了,输出类似如下:


<Metadata  Version="1.1">  <AW    Action="REMOVE"    Owner="GLOBAL"  Name="GLOBAL"/><StandardDimension    Action="REMOVE"    Owner="GLOBAL"  Name="CHANNEL"/><StandardDimension    Action="REMOVE"    Owner="GLOBAL"  Name="CUSTOMER"/><TimeDimension    Action="REMOVE"    Owner="GLOBAL"  Name="TIME"/><StandardDimension    Action="REMOVE"    Owner="GLOBAL"  Name="PRODUCT"/>  <Cube    Action="REMOVE"    Owner="GLOBAL"  Name="PRICE_CUBE"/></Metadata>

你可以看到它执行删除操作就是通过Action = "REMOVE" .

 

最后

关于cube 的数据储存和刷新 下一篇介绍,另外还有关于oracle 11g 的OLAP 新特性 更频繁地执行查询重写  ,

分区中的陈旧程度检查  otn上都有介绍, 大家可以去看看

 

参考资料

http://www.oracle.com/technology/global/cn/pub/articles/oracle-database-11g-top-features/11g-dw-olap.html?_template=/ocom/print

otn 上介绍oracle 11g olap 新功能的文章.

 

http://www.oracle.com/technology/products/bi/olap/collateral/OLAP_11g_MV_query_rewrite.html?_template=/ocom/print

介绍cube mv 的刷新方式的文章

 

http://www.dba-oracle.com/t_olap_dimensions_cubes.htm

11g 之前的一篇介绍olap 概念的文章, 由oracle ace Mark Rittman 所写, 其中有关于如何在pl/sql 中创建和维护cube 的代码(awm 操作起来还是更简单些)

分类: OLAP, Oracle 标签: , , ,