oracle dimension的探究(维度)
query rewrite和dimension配合物化视图的巨大作用,可以很大程度的提高查询的性能,在数据仓库中,应用很显著。
首先介绍一下dimension(维度),下面是concept中的概念:
A dimension table is a logical structure that defines hierarchical (parent/child) relationships between pairs of columns or column sets. For example, a dimension can indicate that within a row the city column implies the value of the state column, the state column implies the value of the countrycolumn, and so on.
简而言之,就是维度只是一个逻辑结构,主要有三个重要属性。
第一level,用于定义一个或者一组列为一个整体;
第二hierarchy,定义各个level之间的层次关系;
第三attribute,定义level和某个列的1:1关系维度使用的场所是,当你打开物化视图的查询重写(query rewrite)时,对于包含聚合函数的SQL,可以重新定位到对应的物化视图,而物化视图里面保存的已经有的数据,这样就可以提供查询性能,而当有时不满足物化视图的查询条件时,比如物化视图里面定义的月的聚合情况,而查询条件为查询季的聚合情况时,就不走物化视图,这样性能大大减弱,而维度,就是用来解决这个问题的,他可以表示日、月、季、年等等之间的层次关系,这样虽然查询的是季的情况,他可以通过月的情况,得到季的情况。
实验:
1.先创建一张1000多万的表:
SQL> desc sales;
Name Null? Type
---------- -------- --------
TRANS_DATE DATE
CUST_ID NUMBER(38)
SALES_AMOUNT NUMBER
SQL> select count(*) from sales;
COUNT(*)
----------
14680064
2.创建索引组织表,用于保存日、月、季、年之间的关系:
create table time_hierarchy(day primary,monthy,qtr_yyyy,year) organization index as select distinct to_char(trans_date,'yyyy-mm-dd'),to_char(trans_date,'yyyy-mm'),to_char(trans_date,'Q'),to_char(trans_date,'yyyy') from sales;
3.创建物化视图,用于存储每个客户对应每个月的销售情况:
create materialized view mv_sales
build immediate
refresh on demand
enable query rewrite
as
select sales.cust_id,time_hierarchy.monthy,sum(sales.sales_amount)
from sales,time_hierarchy
where to_char(sales.trans_date,'yyyy-mm-dd')=time_hierarchy.day
group by sales.cust_id,time_hierarchy.monthy
4.对基表进行分析,以使优化器能够优化物化视图的查询重写功能:
analyze table sales compute statistics;
analyze table time_hierarchy compute statistics;
5.设置会话的查询重写功能:
alter session set query_rewrite_enabled=true;
alter session set query_rewrite_integrity=trusted;
6.按月统计销售量:
SQL> edit
wrote file afiedt.buf
select time_hierarchy.monthy,sum(sales_amount) from scott.sales,scott.time_hierarchy
where to_char(scott.sales.trans_date,'yyyy-mm-dd')=scott.time_hierarchy.day
group by scott.time_hierarchy.monthy
SQL> /
MONTHY SUM(SALES_AMOUNT)
---------- ----------------------------
1981-12 4141875200
1987-04 3145728000
1981-05 2988441600
1982-01 1363148800
1981-09 2883584000
1987-05 1153433600
1981-02 2988441600
1981-11 5242880000
1981-04 3119513600
1980-12 838860800
1981-06 2569011200
11 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 3566649941
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 252 | 4 (25)| 00:00:01 |
| 1 | HASH GROUP BY | | 14 | 252 | 4 (25)| 00:00:01 |
| 2 | MAT_VIEW REWRITE ACCESS FULL| MV_SALES | 14 | 252 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
6 physical reads
0 redo size
835 bytes sent via SQL*Net to client
469 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
11 rows processed
可以看到,查询优化器走了物化视图,而没有走基表,consistent gets也只有3,查询性能十分快
7.如果不按月查询,而按季查询销售量,结果如下:
SQL> edit
Wrote file afiedt.buf
select time_hierarchy.qtr_yyyy,sum(sales_amount) from scott.sales,scott.time_hierarchy
where to_char(scott.sales.trans_date,'yyyy-mm-dd')=scott.time_hierarchy.day
group by scott.time_hierarchy.qtr_yyyy
SQL> /
QTR SUM(SALES_AMOUNT)
----- ---------------
1 4351590400
3 2883584000
4 1.0224E+10
2 1.2976E+10
Execution Plan
----------------------------------------------------------
Plan hash value: 3402703070
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----- ----------- --------- -------- ------- --------------- ---------
| 0 | SELECT STATEMENT | | 4 | 84 | 10095 (10)| 00:02:02 |
| 1 | HASH GROUP BY | | 4 | 84 | 10095 (10)| 00:02:02 |
|* 2 | HASH JOIN | | 14M| 294M| 9329 (3)| 00:01:52 |
| 3 | INDEX FULL SCAN | SYS_IOT_TOP_58953 | 13 | 143 | 1 (0)| 00:00:01 |
| 4 | TABLE ACCESS FULL| SALES | 14M| 140M| 9256 (2)| 00:01:52 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("TIME_HIERARCHY"."DAY"=TO_CHAR(INTERNAL_FUNCTION("SALES"."TRANS_DAT
E"),'yyyy-mm-dd'))
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
41368 consistent gets
41362 physical reads
0 redo size
683 bytes sent via SQL*Net to client
469 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4 rows processed
可以看到走的是基表,没走物化视图,并且consistent gets为41368,查的时候很慢
8.建立dimension,用来表示日、月、季、年之间的层次关系,这样就可以使用query rewrite功能:
8.1建立维护:
create dimension time_hierarchy_dim
level day is time_hierarchy.day
level monthy is time_hierarchy.monthy
level qtr_yyyy is time_hierarchy.qtr_yyyy
level year is time_hierarchy.year
hierarchy time_rollup
(
day child of
monthy child of
qtr_yyyy child of
year
)
attribute monthy
determines monthy;
8.2再次按季查询销售量,结果如下:
SQL> edit
Wrote file afiedt.buf
select time_hierarchy.qtr_yyyy,sum(sales_amount) from scott.sales,scott.time_hierarchy
where to_char(scott.sales.trans_date,'yyyy-mm-dd')=scott.time_hierarchy.day
group by scott.time_hierarchy.qtr_yyyy
SQL> /
QTR SUM(SALES_AMOUNT)
--- -----------------
1 4351590400
3 2883584000
4 1.0224E+10
2 1.2976E+10
Execution Plan
----------------------------------------------------------
Plan hash value: 1315230953
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 42 | 6 (34)| 00:00:01 |
| 1 | HASH GROUP BY | | 3 | 42 | 6 (34)| 00:00:01 |
| 2 | VIEW | | 3 | 42 | 6 (34)| 00:00:01 |
| 3 | HASH UNIQUE | | 3 | 114 | 6 (34)| 00:00:01 |
|* 4 | HASH JOIN | | 17 | 646 | 5 (20)| 00:00:01 |
| 5 | INDEX FULL SCAN | SYS_IOT_TOP_58953 | 13 | 104 | 1 (0)| 00:00:01 |
| 6 | MAT_VIEW REWRITE ACCESS FULL| MV_SALES| 14 | 420 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("MONTHY"="MV_SALES"."MONTHY")
Note
-----
- dynamic sampling used for this statement --动态采样
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
683 bytes sent via SQL*Net to client
469 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4 rows processed
可以看到再次走了物化视图,并且逻辑读减少到只有4,这样的性能提高特别明显。
oracle dimension的探究(维度)相关推荐
- Oracle Dimension in DWH
重读 Tom 大师的 Expert One-on-One Oracle, 发现有对dimension的精彩讲解, 并在强大的网络中找到了如下资料,最宝贵的是有sample: 在数据仓库环境中,我们通常 ...
- Oracle优化器:星型转换
Oracle 8i中引入了星型转换(star transformation)的优化器新特性以便更有效地处理星型查询.星型查询语句多用于基于星型模型设计的数据仓库应用中.星型模型的称谓源于该种模型以图形 ...
- 任务定义的脑网络的内在连接模式可以个体化预测精神分裂症患者的认知症状维度
尽管精神分裂症患者的临床表现存在明显的个体间差异,但患者的精神病理学个体维度与其脑网络功能变异性的关联程度尚不清楚.在本研究中,我们使用基于网络的个体精神病理预测模型,基于4个数据驱动获得的症状维度来 ...
- 【 MATLAB 】cat 函数介绍(沿指定维度串联数组)
cat Concatenate arrays along specified dimension 沿指定维度串联数组 Syntax C = cat(dim, A, B) C = cat(dim, A1 ...
- oracle中慢sql优化思路
参考资料:官方文档SQL Tuning Guide https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/sql- ...
- 维度建模的基本概念及过程
维度建模的基本概念及过程 摘要:本文首先介绍维度模型中的维度表和事实表这2个基本构成要素的基础知识:其次,介绍设计维度模型的4个基本步骤:再次,围绕某银行为实现业务价值链数据集成的需要,介绍多维体系结 ...
- Error:All flavors must now belong to a named flavor dimension. Learn more at
这个问题原因是AndroidStudio升级到3.0.1之后,gradle4.1版本.会提示Error:All flavors must now belong to a named flavor di ...
- 解决Error:All flavors must now belong to a named flavor dimension
前言 最近写的项目越来越大,出现了64K问题,所以用了Multidex来突破64K方法数限制,然后为了优化编译速度在build.gradle文件中加入了如下代码 productFlavors {// ...
- 命题作文:Dimension Tree区间查找与IP数据包分类
这个题目有点大,而且我要严格控制字数,不能像< 命题作文:在一棵IPv4地址树中彻底理解IP路由表的各种查找过程>那样扯得那么开了.事实上,这篇作文是上一篇作文中关于区间查找小节的扩展. ...
最新文章
- 矮个男生不好找对象?某大厂程序员自称太高也难找对象!身高196cm,有房有车,却被嫌太高!...
- Oracle分析函数FIRST_VALUE、LAST_VALUE
- postman请求soap 请求_postman中请求如何传递对象到spring controller?
- Android: AndroidStudio使用OpenCV-Java
- IDE日志分析方法pt。 1个
- Rete之外的生活– RIP Rete 2013 :)
- HTML连载70-相片墙、盒子阴影和文字阴影
- 软考路:2021年系统架构设计师之流水账
- Public权限下的列目录
- 手机运行内存6G,可是开机一会就变成2个多G了,为什么?
- bzoj 4401: 块的计数
- main函数参数解析
- C++ STL 各种搜索查找算法总结使用
- 网站微信扫码登录实现步骤
- 测试脚本常用知识点python
- Unity + LeapMotion 识别食指伸出以及食指与 UGUI的 交互
- React制作页面在线截图功能
- 微信扫描二维码实现下载app文件
- origin画图记录
- Excel 轻松制作 二级联动 下拉列表清单
热门文章
- java8 zoneid_java8之localDateTime, ZoneId, Instant使用
- unity疯狂牧场完整项目源码 - Frenzy Farming time management game kit V1.0
- JavaScript星星连线技巧
- 腾讯发布智能硬件全民WiFi 可提高游戏速度
- 微信小程序识别二维码
- python爬虫热点项目—滑块验证码项目(以Bilili为例)
- 键盘录入一个字符串,统计该字符串中的大写字母、小写字母、数字字符和其他字符分别有多少个 例如,键盘录入abcABCD12345!@#$%,输出结果为:小写字母有3个,大写字母有4个,数字字符有5个,
- 关于Layout Constraint的动态update方式
- 你这么真诚,一定是骗子!
- 观自在菩萨,行深般若波罗蜜多时,照见五蕴皆空,度一切苦厄。舍利子,色不异空,空不异色,色即是空,空即是色,受想行识,亦复如是。舍利子,是诸法空相,不生不灭,不垢不净,不增不减。是故空中无色,无受想行识