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的探究(维度)相关推荐

  1. Oracle Dimension in DWH

    重读 Tom 大师的 Expert One-on-One Oracle, 发现有对dimension的精彩讲解, 并在强大的网络中找到了如下资料,最宝贵的是有sample: 在数据仓库环境中,我们通常 ...

  2. Oracle优化器:星型转换

    Oracle 8i中引入了星型转换(star transformation)的优化器新特性以便更有效地处理星型查询.星型查询语句多用于基于星型模型设计的数据仓库应用中.星型模型的称谓源于该种模型以图形 ...

  3. 任务定义的脑网络的内在连接模式可以个体化预测精神分裂症患者的认知症状维度

    尽管精神分裂症患者的临床表现存在明显的个体间差异,但患者的精神病理学个体维度与其脑网络功能变异性的关联程度尚不清楚.在本研究中,我们使用基于网络的个体精神病理预测模型,基于4个数据驱动获得的症状维度来 ...

  4. 【 MATLAB 】cat 函数介绍(沿指定维度串联数组)

    cat Concatenate arrays along specified dimension 沿指定维度串联数组 Syntax C = cat(dim, A, B) C = cat(dim, A1 ...

  5. oracle中慢sql优化思路

    参考资料:官方文档SQL Tuning Guide https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/sql- ...

  6. 维度建模的基本概念及过程

    维度建模的基本概念及过程 摘要:本文首先介绍维度模型中的维度表和事实表这2个基本构成要素的基础知识:其次,介绍设计维度模型的4个基本步骤:再次,围绕某银行为实现业务价值链数据集成的需要,介绍多维体系结 ...

  7. 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 ...

  8. 解决Error:All flavors must now belong to a named flavor dimension

    前言 最近写的项目越来越大,出现了64K问题,所以用了Multidex来突破64K方法数限制,然后为了优化编译速度在build.gradle文件中加入了如下代码 productFlavors {// ...

  9. 命题作文:Dimension Tree区间查找与IP数据包分类

    这个题目有点大,而且我要严格控制字数,不能像< 命题作文:在一棵IPv4地址树中彻底理解IP路由表的各种查找过程>那样扯得那么开了.事实上,这篇作文是上一篇作文中关于区间查找小节的扩展. ...

最新文章

  1. 矮个男生不好找对象?某大厂程序员自称太高也难找对象!身高196cm,有房有车,却被嫌太高!...
  2. Oracle分析函数FIRST_VALUE、LAST_VALUE
  3. postman请求soap 请求_postman中请求如何传递对象到spring controller?
  4. Android: AndroidStudio使用OpenCV-Java
  5. IDE日志分析方法pt。 1个
  6. Rete之外的生活– RIP Rete 2013 :)
  7. HTML连载70-相片墙、盒子阴影和文字阴影
  8. 软考路:2021年系统架构设计师之流水账
  9. Public权限下的列目录
  10. 手机运行内存6G,可是开机一会就变成2个多G了,为什么?
  11. bzoj 4401: 块的计数
  12. main函数参数解析
  13. C++ STL 各种搜索查找算法总结使用
  14. 网站微信扫码登录实现步骤
  15. 测试脚本常用知识点python
  16. Unity + LeapMotion 识别食指伸出以及食指与 UGUI的 交互
  17. React制作页面在线截图功能
  18. 微信扫描二维码实现下载app文件
  19. origin画图记录
  20. Excel 轻松制作 二级联动 下拉列表清单

热门文章

  1. java8 zoneid_java8之localDateTime, ZoneId, Instant使用
  2. unity疯狂牧场完整项目源码 - Frenzy Farming time management game kit V1.0
  3. JavaScript星星连线技巧
  4. 腾讯发布智能硬件全民WiFi 可提高游戏速度
  5. 微信小程序识别二维码
  6. python爬虫热点项目—滑块验证码项目(以Bilili为例)
  7. 键盘录入一个字符串,统计该字符串中的大写字母、小写字母、数字字符和其他字符分别有多少个 例如,键盘录入abcABCD12345!@#$%,输出结果为:小写字母有3个,大写字母有4个,数字字符有5个,
  8. 关于Layout Constraint的动态update方式
  9. 你这么真诚,一定是骗子!
  10. 观自在菩萨,行深般若波罗蜜多时,照见五蕴皆空,度一切苦厄。舍利子,色不异空,空不异色,色即是空,空即是色,受想行识,亦复如是。舍利子,是诸法空相,不生不灭,不垢不净,不增不减。是故空中无色,无受想行识