- 浏览: 78538 次
- 来自: ...
最近访客 更多访客>>
最新评论
-
Triffic:
相见恨晚啊,坚持看完
四个开源商业智能平台比较(三) -
java-007:
Thank you, the landlord, a good ...
商业智能平台研究(九) ETL 中的数据质量控制 -
zouming_3:
感觉jaspersoft做的要好看些。
四个开源商业智能平台比较(三)
着上一篇的步骤部署好了mondrian 之后
进入数据库,修改所有以agg开头的表格,把它们重命名或者或者drop掉,下一篇我会解释为什么的.
修改 WEB-INF / mondrian.properties 文件,加上如下两个key
mondrian.trace.level=1
mondrian.debug.out.file=e:/mondrianfoodmart.log
然后把mondrian.properties文件copy 到tomcat 的 bin 目录下重新启动tomcat.
打开浏览器进入JPivot with arrows 的example .
一直drill down product. All Products -> Drink -> Alcoholic Beverages -> Beer and Wine -> Beer -> Good -> Good Imported Beer
你会在e:/ 下找到一个mondrianfoodmart.log 的文件,打开这个文件,你会看到类似与下面的语句 :
SqlMemberSource.getMemberChildren: executing sql [select "time_by_day"."the_year" as "c0" from "time_by_day" "time_by_day" group by "time_by_day"."the_year" order by "time_by_day"."the_year" ASC], exec 31 ms, exec+fetch 31 ms, 2 rows
你可以把这个文件copy一份到其他地方,我们就是要分析这个文件,来知道mondrian到底执行了那些sql语句.
它的语法格式大概如下:
**** executing sql [ 执行的sql ] exec 时间 , exec + fetch 时间 , 取得的数据行数.
其中前面的**** 部分是看你执行的那些操作,
mondrian 做drill down 的时候一般执行3 个 sql ,
1 . 取得左边的dimension 的一个层次结构下的子元素的数目.比如All Products 下就有三个: Drink , Food , Non-Consumable
一般通过如下sql取得 :
SELECT COUNT(DISTINCT "product_class"."product_family") AS "c0" FROM "product_class" "product_class";
2 . 取得dimension 子元素的名称 : 象如下sql :
SELECT "product_class"."product_department" AS "c0"
FROM "product" "product", "product_class" "product_class"
WHERE "product"."product_class_id" = "product_class"."product_class_id"
AND "product_class"."product_family" = 'Drink'
GROUP BY "product_class"."product_department"
ORDER BY "product_class"."product_department" ASC;
3 . 取得对应dimension的实际数据 , 象如下sql:
SELECT "time_by_day"."the_year" AS "c0", "product_class"."product_family" AS "c1",
SUM("sales_fact_1997"."store_sales") AS "m0", SUM("sales_fact_1997"."store_cost") AS "m1"
FROM "time_by_day" "time_by_day", "sales_fact_1997" "sales_fact_1997", "product_class" "product_class",
"product" "product"
WHERE "sales_fact_1997"."time_id" = "time_by_day"."time_id"
AND "time_by_day"."the_year" = 1997
AND "sales_fact_1997"."product_id" = "product"."product_id"
AND "product"."product_class_id" = "product_class"."product_class_id"
GROUP BY "time_by_day"."the_year",
"product_class"."product_family";
打开你的文本编辑器,我用的是vi , 执行两个替换命令
1 . :%s/^.*executing sql \[//g
2 . :%s/\], exec.*$/;/g
第一个命令是将所有' executing sql [ '之前的字符串去掉,第二个命令是将所有 ' ] exec ' 之后的字符串换成 ;
这个时候就只剩下可以执行的sql 了.把里面的内容copy 到你的sql 编辑器里面,我用的是oracle 官方的sql developer , 把它format一下,然后依次执行一下里面的所有sql ,看一下结果.
通过研究这个结果,我们可以确定product 的层次关系:
1 . 在product表里面,没有使用联合主键来确定product的唯一性,而是使用 product_id 作为主键,其中product_name 也是唯一的,对应 : Good Imported Beer , Good Light Beer .
2 . product_name 上一级是brand_name ,对应 : Good , Pearl ,Portsmounth , Top Measure , Walrus
3 . brand_name 的上一级是subcategory ,它在product_class表里面,product 和 product_class 通过product_class_id 链接起来,同样的,product_class 表没有用联合主键来定义唯一性,而是用product_class_id 来做主键,其中product_subcategory 是唯一的,跟product_class_id 是一一对应的. subcategory 有:Beer , Wine
4 . product_subcategory的上一级是category ,对应 : Beer and Wine .
5 . category的上一级是department , 对应 : Alcoholic Beverages , Beverages , Dairy .
6 . department的上一级是family ,也是最顶级了 , 对应 : Drink , Food ,Non-Consumable .
在我的例子中,我将使用Time 和 Product 来做Dimension , 应为他们比较有代表性,
time_by_day 表中,有十个column ,最后一个 fiscal_period 没有用.
1 . time_id 这个表中的主键
2 . the_date 数据类型是timestamp,是唯一的,其中定义了从1997年1月1日开始到1998年12月31日的所有日期.
3 . the_day 定义的星期,比如 Monday .
4 . the_month 定义的月份,比如September
5 . the_year 年份 , 1997 和 1998 .
6 . day_of_month 月份中的日期, 比如23代表那个月份的23号 .
7 . week_of_year 一年中的第几个星期,比如40 代表一年中的第40个星期
8 . month_of_year 一年中的第几个月,比如9 代表第九个月,
9 . quarter , 季度 .
Time dimension 建立在time_by_day 表上,其中可以用多个层级来表示Time的level 关系,比如the_year -> quarter -> the_month -> the_date ,或者year -> week_of_year -> the_day -> the_date .
Product Dimension 建立在product 和 product_class 表上,是跨表的dimension
product.product_id 主键
product.product_name 最低的level .
product.brand_name 第二level .
product.product_class_id 映射到product_class 的外键
product 其他colun 都是非主属性了.
product_class.product_class_id 主键
product_class.product_subcategory 唯一的,对应product_class_id 第三level.
product_class.product_category 第四level.
product.product_department 第五level.
product.product_family 第六level.
下篇接着写dimension + materialized view .
进入数据库,修改所有以agg开头的表格,把它们重命名或者或者drop掉,下一篇我会解释为什么的.
修改 WEB-INF / mondrian.properties 文件,加上如下两个key
mondrian.trace.level=1
mondrian.debug.out.file=e:/mondrianfoodmart.log
然后把mondrian.properties文件copy 到tomcat 的 bin 目录下重新启动tomcat.
打开浏览器进入JPivot with arrows 的example .
一直drill down product. All Products -> Drink -> Alcoholic Beverages -> Beer and Wine -> Beer -> Good -> Good Imported Beer
你会在e:/ 下找到一个mondrianfoodmart.log 的文件,打开这个文件,你会看到类似与下面的语句 :
SqlMemberSource.getMemberChildren: executing sql [select "time_by_day"."the_year" as "c0" from "time_by_day" "time_by_day" group by "time_by_day"."the_year" order by "time_by_day"."the_year" ASC], exec 31 ms, exec+fetch 31 ms, 2 rows
你可以把这个文件copy一份到其他地方,我们就是要分析这个文件,来知道mondrian到底执行了那些sql语句.
它的语法格式大概如下:
**** executing sql [ 执行的sql ] exec 时间 , exec + fetch 时间 , 取得的数据行数.
其中前面的**** 部分是看你执行的那些操作,
mondrian 做drill down 的时候一般执行3 个 sql ,
1 . 取得左边的dimension 的一个层次结构下的子元素的数目.比如All Products 下就有三个: Drink , Food , Non-Consumable
一般通过如下sql取得 :
SELECT COUNT(DISTINCT "product_class"."product_family") AS "c0" FROM "product_class" "product_class";
2 . 取得dimension 子元素的名称 : 象如下sql :
SELECT "product_class"."product_department" AS "c0"
FROM "product" "product", "product_class" "product_class"
WHERE "product"."product_class_id" = "product_class"."product_class_id"
AND "product_class"."product_family" = 'Drink'
GROUP BY "product_class"."product_department"
ORDER BY "product_class"."product_department" ASC;
3 . 取得对应dimension的实际数据 , 象如下sql:
SELECT "time_by_day"."the_year" AS "c0", "product_class"."product_family" AS "c1",
SUM("sales_fact_1997"."store_sales") AS "m0", SUM("sales_fact_1997"."store_cost") AS "m1"
FROM "time_by_day" "time_by_day", "sales_fact_1997" "sales_fact_1997", "product_class" "product_class",
"product" "product"
WHERE "sales_fact_1997"."time_id" = "time_by_day"."time_id"
AND "time_by_day"."the_year" = 1997
AND "sales_fact_1997"."product_id" = "product"."product_id"
AND "product"."product_class_id" = "product_class"."product_class_id"
GROUP BY "time_by_day"."the_year",
"product_class"."product_family";
打开你的文本编辑器,我用的是vi , 执行两个替换命令
1 . :%s/^.*executing sql \[//g
2 . :%s/\], exec.*$/;/g
第一个命令是将所有' executing sql [ '之前的字符串去掉,第二个命令是将所有 ' ] exec ' 之后的字符串换成 ;
这个时候就只剩下可以执行的sql 了.把里面的内容copy 到你的sql 编辑器里面,我用的是oracle 官方的sql developer , 把它format一下,然后依次执行一下里面的所有sql ,看一下结果.
通过研究这个结果,我们可以确定product 的层次关系:
1 . 在product表里面,没有使用联合主键来确定product的唯一性,而是使用 product_id 作为主键,其中product_name 也是唯一的,对应 : Good Imported Beer , Good Light Beer .
2 . product_name 上一级是brand_name ,对应 : Good , Pearl ,Portsmounth , Top Measure , Walrus
3 . brand_name 的上一级是subcategory ,它在product_class表里面,product 和 product_class 通过product_class_id 链接起来,同样的,product_class 表没有用联合主键来定义唯一性,而是用product_class_id 来做主键,其中product_subcategory 是唯一的,跟product_class_id 是一一对应的. subcategory 有:Beer , Wine
4 . product_subcategory的上一级是category ,对应 : Beer and Wine .
5 . category的上一级是department , 对应 : Alcoholic Beverages , Beverages , Dairy .
6 . department的上一级是family ,也是最顶级了 , 对应 : Drink , Food ,Non-Consumable .
在我的例子中,我将使用Time 和 Product 来做Dimension , 应为他们比较有代表性,
time_by_day 表中,有十个column ,最后一个 fiscal_period 没有用.
1 . time_id 这个表中的主键
2 . the_date 数据类型是timestamp,是唯一的,其中定义了从1997年1月1日开始到1998年12月31日的所有日期.
3 . the_day 定义的星期,比如 Monday .
4 . the_month 定义的月份,比如September
5 . the_year 年份 , 1997 和 1998 .
6 . day_of_month 月份中的日期, 比如23代表那个月份的23号 .
7 . week_of_year 一年中的第几个星期,比如40 代表一年中的第40个星期
8 . month_of_year 一年中的第几个月,比如9 代表第九个月,
9 . quarter , 季度 .
Time dimension 建立在time_by_day 表上,其中可以用多个层级来表示Time的level 关系,比如the_year -> quarter -> the_month -> the_date ,或者year -> week_of_year -> the_day -> the_date .
Product Dimension 建立在product 和 product_class 表上,是跨表的dimension
product.product_id 主键
product.product_name 最低的level .
product.brand_name 第二level .
product.product_class_id 映射到product_class 的外键
product 其他colun 都是非主属性了.
product_class.product_class_id 主键
product_class.product_subcategory 唯一的,对应product_class_id 第三level.
product_class.product_category 第四level.
product.product_department 第五level.
product.product_family 第六level.
下篇接着写dimension + materialized view .
发表评论
-
JFreeReport 0.9 的特性预览
2007-09-12 15:13 2170在Pentaho的官方论坛里,我看到了JFreeReport ... -
在Tomcat上部署和运行Pentaho示例1.2版本
2007-09-12 15:10 2520下载pentaho_j2ee_deploy ... -
在Tomcat上如何集成Pentaho和Liferay
2007-09-12 15:08 1732... -
BIRT API学习
2007-09-12 15:06 2851以下这个例子来自birt 的官方教材,我没有改动任何的信息. ... -
商业智能(十八) 安装BIRT
2007-09-12 15:04 1967安装Birt 其实非常的简单.只需要下载Birt-Runtim ... -
Mondrian 如何使用 materialized view
2007-09-12 15:03 1959第十四篇文章中,我把 ... -
用materialized view + dimension 来提高mondrian 的性能2
2007-09-12 15:01 1946接着上一篇的定义我们定义如下两个dimension : CRE ... -
mondrian + oracle 部署foodmart demo
2007-09-12 14:59 3458mondrian作为开源世界的OL ... -
商业智能研究(十二) OLAP 相关的一些开源项目
2007-09-12 14:53 2300联机分析(OLAP)处理专门设计用于支持复杂的分析操作,侧重对 ... -
在tomcat上部署pentaho 1.5.3
2007-09-12 14:51 1879在tomcat上部署pentaho 1.5.3 最近一直在做m ... -
商业智能平台研究(十一) BI基本概念
2007-09-12 14:47 2706商业智能对每个不同的公司都有不同的定义. 如果你对这些公司的定 ... -
商业智能平台研究 (十) ETL 选型
2007-09-12 14:42 3568ETL (Extract-Transform-Load的缩写, ... -
商业智能平台研究(九) ETL 中的数据质量控制
2007-09-12 14:40 1710数据质量一直是ETL工具 ... -
商业智能平台研究(八)
2007-09-12 14:36 2008... -
商业智能平台研究(七)
2007-09-12 14:34 1386五一期间哪里都没有去 ... -
四个开源商业智能平台比较(六)
2007-09-12 14:30 2115roadmap是一个项目的计划表,个人认为任何一个项目都应该有 ... -
四个开源商业智能平台比较(五)
2007-09-12 14:28 2215lumi 问JPivot能否单独使用,不能,根据其主页上的描述 ... -
四个开源商业智能平台比较(四)
2007-09-12 14:26 1861我想问,如果贵公司是 ... -
四个开源商业智能平台比较(三)
2007-09-12 11:58 2598先回答一下各位的评论,blogjava上的江南白衣 朋友(主 ... -
四个开源商业智能平台比较(二)
2007-09-12 11:53 1937一个好的项目总是有很多的文档,一个失败的项目总是有各种理由没有 ...
相关推荐
物化视图的主要用途包括提高查询性能、实现数据的局部复制以及支持数据仓库的汇总数据。 在数据复制场景下,物化视图可以作为远程数据的本地副本,提供只读访问,减少对远程服务器的依赖。例如,创建一个基于主键的...
这篇文章主要介绍了PostgreSQL物化视图(materialized view)过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1、创建视图 CREATE MATERIALIZED VIEW ...
物化视图主要用于提高查询性能,特别是对于那些复杂查询或者经常需要汇总数据的情况。它们可以作为数据仓库的一部分,或者在分布式数据库系统中用于数据复制。 在提供的文件中,"项目中物化视图.sql"可能包含创建...
物化视图是远程数据的本地副本,用于提高查询性能,尤其是在数据仓库环境中,通过预计算汇总数据,显著提升了数据分析的速度。 物化视图可以查询单个表、视图,甚至其他物化视图。在数据复制场景下,物化视图作为...
而材质化视图则会预先计算出结果并存储为物理表,因此,对于复杂的联接操作或聚合查询,使用材质化视图可以显著提高查询性能。尤其当源表数据频繁更新,但需要快速获取预处理过的数据时,材质化视图尤为有用。 1. *...
NEXT SYSDATE+1 AS ... ``` 这将使得物化视图每天刷新一次。 物化视图也可以设置日志,以便追踪数据的变化。例如: ```sql CREATE MATERIALIZED VIEW LOG ON TABLE_NAME WITH SEQUENCE,ROWID(NUM1,NUM2,NUM3,...
dbms_advisor.tune_mview使用的例子
开发者可以使用 Materialized View 来提高数据库性能。 10. 优化数据库参数 数据库参数的设置对数据库性能产生重要影响。开发者可以根据不同的应用场景设置合适的数据库参数,例如设置合适的缓存大小、调整并发度...
相比普通视图,物化视图可以提供更好的性能,因为普通视图是虚拟表,任何对视图的查询实际上都是转换为对 SQL 语句的查询,性能并没有实际上提高。 在 Vastbase G100 中,物化视图可以分为全量物化视图和增量物化...
CREATE MATERIALIZED VIEW mv_emp_pk REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/48 WITH PRIMARY KEY AS SELECT * FROM emp@remote_db; ``` 这里使用了`REFRESH FAST`选项,意味着需要为源表创建物化视图...
Postgres物化视图演示 设置 在您的机器上安装了postgresql 运行脚本 createdb your_database psql -f setup_scripts/00_setup.sql psql -d your_database 如果需要更多种子数据, bundle exec ruby dev.rb以为...
Doris 是一个开源的分布式分析型数据库,旨在帮助用户快速处理海量数据,提供了物化视图和索引等功能,以提高查询性能和数据的一致性。下面将详细介绍 Doris 的物化视图和索引的概念、应用场景和使用方法。 物化...
3. **分页与虚拟化**:对于包含大量选项的下拉列表,React Select支持分页和虚拟化,以提高性能并减少内存消耗。 4. **实时搜索**:用户可以通过在输入框中输入文字,实时过滤出匹配的选项,提升用户体验。 5. **...
5. 使用数据库内置功能:如SQL Server的索引视图、物化视图,Oracle的materialized view等,可以预先计算并存储结果。 总结,SQL性能测试是数据库管理的重要环节,通过深入分析SQL语句的执行情况,我们可以找出性能...
Oracle的Advanced Queuing和Materialized View Replication也是提高性能和可用性的特殊工具。 5. **环境优化**:操作系统层面的优化也是不可忽视的一环,尤其是对于AIX这样的高级UNIX系统。这包括调整内核参数,如...
在Oracle数据库中,物化视图(Materialized View, MV)是一种重要的性能优化工具,尤其在数据仓库和决策支持系统中。物化视图预先计算并存储了一个查询的结果,允许快速访问而不是每次需要时重新执行复杂的查询。在...
1. **跟踪依赖关系**:它能够识别和记录每个Materialized View对其它表或视图的依赖,确保当依赖发生变化时能及时作出响应。 2. **自动刷新**:在数据更新后,管理器可以自动或按需刷新Materialized View,以保持其...
九、物化视图与materialized view logs 物化视图可以预先计算并存储复杂查询的结果,提高查询速度。物化视图日志则记录了基表的更改,用于更新物化视图。合理使用这两者,可以提升数据汇总和报告的性能。 十、...