Oracle 使用维进行查询重写

news2024/11/19 16:34:36

Oracle  使用维进行查询重写

conn / as sysdba
alter user sh account unlock identified by sh;
conn sh/sh
query_rewrite_integrity =  TRUSTED


--物化视图的定义

select query from user_mviews where MVIEW_NAME='CAL_MONTH_SALES_MV';

CREATE MATERIALIZED VIEW cal_month_sales_mv
ENABLE QUERY REWRITE AS
SELECT t.calendar_month_desc,SUM(s.amount_sold) AS dollars
FROM sales s,times t 
WHERE s.time_id = t.time_id
GROUP BY t.CALENDAR_MONTH_DESC;

SELECT   t.calendar_month_desc,sum(s.amount_sold) AS dollars
FROM     sales s,times t
WHERE    s.time_id = t.time_id
GROUP BY t.calendar_month_desc;

---------------------------------------------------------------------------
--当我们运行的查询和视图一致的时候,会直接查询视图而不进行真的查询
SQL> SELECT   t.calendar_month_desc,sum(s.amount_sold) AS dollars
    FROM     sales s,times t
    WHERE    s.time_id = t.time_id
    GROUP BY t.calendar_month_desc;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=35 Bytes=525)
   1    0   TABLE ACCESS (FULL) OF 'CAL_MONTH_SALES_MV' (Cost=3 Card=3
          5 Bytes=525)

--------------------------------------------------------------------------
--因为我们定义了维,维中描述了月和年的关系,当我们求年的汇总的时候就会汇总
月的结果,而不是真的查询。--------------------建立自己的维-----------------

CREATE DIMENSION "SH"."TIMES_DIM2"
LEVEL "MONTH" IS ("TIMES"."CALENDAR_MONTH_DESC") 
LEVEL "YEAR" IS ("TIMES"."CALENDAR_YEAR") 
HIERARCHY "CAL_ROLLUP2" ("MONTH" CHILD OF "YEAR") 
ATTRIBUTE "MONTH" DETERMINES "TIMES"."CALENDAR_MONTH_DESC" 
ATTRIBUTE "YEAR" DETERMINES "TIMES"."CALENDAR_YEAR";


alter system set query_rewrite_integrity =  TRUSTED;
--alter system set query_rewrite_integrity =STALE_TOLERATED;

SELECT   t.CALENDAR_YEAR, sum(s.amount_sold) AS dollars
FROM     sales s,  times t
WHERE    s.time_id = t.time_id
GROUP BY t.CALENDAR_YEAR;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=17 Card=4 Bytes=108)
   1    0   SORT (GROUP BY) (Cost=17 Card=4 Bytes=108)
   2    1     HASH JOIN (Cost=16 Card=99 Bytes=2673)
   3    2       TABLE ACCESS (FULL) OF 'CAL_MONTH_SALES_MV' (Cost=3 Card=35 Bytes=525)
   4    2       VIEW (Cost=13 Card=136 Bytes=1632)
   5    4         SORT (UNIQUE) (Cost=13 Card=136 Bytes=1632)
   6    5           TABLE ACCESS (FULL) OF 'TIMES' (Cost=12 Card=1461 Bytes=17532)


上面使用了查询重写,代价为17下面改变参数,禁止了查询重写,代价为2223

alter system set query_rewrite_integrity=ENFORCED;
SELECT   t.CALENDAR_YEAR,sum(s.amount_sold) AS dollars
FROM     sales s,times t
WHERE    s.time_id = t.time_id
GROUP BY t.CALENDAR_YEAR;

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2223 Card=4 Bytes=96 )
   1    0   SORT (GROUP BY) (Cost=2223 Card=4 Bytes=96)
   2    1     HASH JOIN (Cost=1329 Card=1016271 Bytes=24390504)
   3    2       TABLE ACCESS (FULL) OF 'TIMES' (Cost=12 Card=1461 Bytes=17532)
   4    2       PARTITION RANGE (ALL)
   5    4         TABLE ACCESS (FULL) OF 'SALES' (Cost=1218 Card=1016271 ytes=12195252)

如果你在你的sh用户中看不到我的结果,自己建立一个维,老的维可能有点问题,oracle原厂越来越不严谨了

CREATE DIMENSION "SH"."TIMES_DIM2"
LEVEL "MONTH" IS ("TIMES"."CALENDAR_MONTH_DESC") 
LEVEL "YEAR" IS ("TIMES"."CALENDAR_YEAR") 
HIERARCHY "CAL_ROLLUP2" ("MONTH" CHILD OF "YEAR") 
ATTRIBUTE "MONTH" DETERMINES "TIMES"."CALENDAR_MONTH_DESC" 
ATTRIBUTE "YEAR" DETERMINES "TIMES"."CALENDAR_YEAR";


-----------------------------例子2--------------------------------
--建立自己的物化视图,用来统计每个月每个城市的消费
--原来有个客户维,这个为比较复杂,关联了其它表。

set long 10000
select dbms_metadata.get_ddl('DIMENSION','CUSTOMERS_DIM','SH') FROM DUAL;


这个语句可以查看维的定义!有关联的语法

视图1为统计城市

CREATE MATERIALIZED VIEW cal_month_sales_cust_mv
ENABLE QUERY REWRITE AS
SELECT t.calendar_month_desc,CUST_CITY,SUM(s.amount_sold) AS dollars
FROM sales s,times t , CUSTOMERS c
WHERE s.time_id = t.time_id and s.CUST_ID=c.CUST_ID        
GROUP BY t.CALENDAR_MONTH_DESC,CUST_CITY;

视图2为统计城市代码,城市代码在客户维中有描述

CREATE MATERIALIZED VIEW cal_month_sales_cust_mv2
ENABLE QUERY REWRITE AS
SELECT t.calendar_month_desc,CUST_CITY_id,SUM(s.amount_sold) AS dollars
FROM sales s,times t , CUSTOMERS c
WHERE s.time_id = t.time_id and s.CUST_ID=c.CUST_ID        
GROUP BY t.CALENDAR_MONTH_DESC,CUST_CITY_id;

验证查询重写--合计了每个月,每个城市的消费

SELECT t.calendar_month_desc,CUST_CITY,SUM(s.amount_sold) AS dollars
FROM sales s,times t , CUSTOMERS c
WHERE s.time_id = t.time_id and s.CUST_ID=c.CUST_ID        
GROUP BY t.CALENDAR_MONTH_DESC,CUST_CITY;

验证查询重写--合计了每年,每个城市的消费,使用了时间维

SELECT t.CALENDAR_YEAR,CUST_CITY,SUM(s.amount_sold) AS dollars
FROM sales s,times t , CUSTOMERS c
WHERE s.time_id = t.time_id and s.CUST_ID=c.CUST_ID        
GROUP BY t.CALENDAR_YEAR,CUST_CITY;

验证查询重写--合计了每年,每个国家的消费,使用了时间维,客户维

SELECT t.CALENDAR_YEAR,COUNTRY_NAME,SUM(s.amount_sold) AS dollars
FROM sales s,times t , CUSTOMERS c,COUNTRIES  gj
WHERE s.time_id = t.time_id 
and s.CUST_ID=c.CUST_ID    
and c.COUNTRY_ID=gj.COUNTRY_ID    
GROUP BY t.CALENDAR_YEAR,COUNTRY_NAME;

维其实很简单,就是定义了层次关系而已!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

租用阿里云4核16G服务器优惠价格多少钱?

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年,配置为阿里云服务器ECS经济型e实例ecs.e-c1m4.xlarge,4核16G、按固定带宽 10Mbs、100GB ESSD Entry系统盘,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接打开如下图&a…

京东云服务器4核8G主机租用价格418元一年,1899元3年

京东云轻量云主机4核8G服务器租用价格418元一年,1899元3年,配置为:轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量,京东云主机优惠活动 yunfuwuqiba.com/go/jd 可以查看京东云服务器详细配置和精准报价单,活动打开如…

mysql表字段长度扩容分析--MySQL什么情况下拓展字段长度会锁表?

MySQL什么情况下拓展字段长度会锁表? 原生MySQL只支持不跨越256字节的在线扩展(online),对于跨越256字节的扩展只支持复制方式(copy),扩展时需要锁表且禁止对数据表进行写操作。 字符串的字段是…

MacOS下载和安装HomeBrew的详细教程

在MacOS上安装Homebrew的详细教程如下:(参考官网:macOS(或 Linux)缺失的软件包的管理器 — Homebrew) 步骤1:检查系统要求 确保你的MacOS版本至少为macOS Monterey (12) (or higher) 或更高版本…

备战蓝桥杯---数论相关问题

目录 一、最大公约数和最小公倍数 二、素数判断 三、同余 四、唯一分解定理 五、约数个数定理 六、约数和定理 五、快速幂 六、费马小定理 七、逆元 一、最大公约数和最小公倍数 文章链接:最大公约数和最小公倍数 二、素数判断 文章链接:在J…

深入浅出 -- 系统架构之分布式集群的分类

一、单点故障问题 集群,相信诸位对这个概念并不陌生,集群已成为现时代中,保证服务高可用不可或缺的一种手段。 回想起初集中式部署的单体应用,因为只有一个节点,因此当该节点出现任意类型的故障(网络、硬件…

《Java面试自救指南》(专题四)Java基础

文章目录 有序集合有哪些?线程安全的集合有哪些?HashMap底层原理ConcurrentHashMap的底层数据结构ArrayList底层原理,ArrayList和Vector/LinkedList的区别String,StringBuffer,StringBuilder的区别 扩展:String不可变…

训练营第十八天(二叉树part05)

第十八天 二叉树part05 513.找树左下角的值 力扣题目链接(opens new window) 题目 给定一个二叉树,在树的最后一行找到最左边的值。 示例 1: 示例 2: 解答 方法一(笨方法,使用层次遍历迭代) class Solution {public int fi…

【ARM 嵌入式 C 常用数据结构系列 25.1 -- linux 双向链表 list_head 使用详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 内核双向链表双向链表的数据结构初始化双向链表在双向链表中添加元素遍历双向链表链表使用示例注意事项 内核双向链表 在Linux内核中,双向链表是一种广泛使用的数据结构,允许从任意节点高效地进行前向或后向…

蓝桥杯-冶炼金属(二分求最大最小)

P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二分做法&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int N 1e410; int n,a,b; int v[N],cnt[N]; int check(int x){for(int i1;i<n;i…

写JDBC遇到的问题

执行会出现以下错误信息 java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ? and loginPwd ? at line 1 at com.mysql.cj.jdbc.exceptions…

05-延迟任务精准发布文章

延迟任务精准发布文章 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在这个事件触发之后的一段时间内触发…

鸿蒙OS元服务开发:【(Stage模型)学习窗口沉浸式能力】

一、体验窗口沉浸式能力说明 在看视频、玩游戏等场景下&#xff0c;用户往往希望隐藏状态栏、导航栏等不必要的系统窗口&#xff0c;从而获得更佳的沉浸式体验。此时可以借助窗口沉浸式能力&#xff08;窗口沉浸式能力都是针对应用主窗口而言的&#xff09;&#xff0c;达到预…

LeetCode 1017. 负二进制转换

解题思路 相关代码 class Solution {public String baseNeg2(int n) {if(n0) return "0";String s"";while(n!0)if(Math.abs(n)%20){nn/(-2);ss0;}else{ss1; n (n-1)/(-2);}String t reverse(s);return t;}public String reverse(String s){Str…

C++——位图和布隆过滤器

在C中&#xff0c;哈希这种思想的应用场景有很多&#xff0c;位图就是其中的一种。 位图 位图&#xff1a;位图是一种哈希思想的产物&#xff0c;可以通过它来对数据进行快速的查找的方法&#xff0c;在位图中&#xff0c;有2种状态来表示在或者不在&#xff0c;即1/0。 位图…

vue2中的局部组件和全局组件

注&#xff1a;vue2中使用组件远没有vue3中简单&#xff0c;具体可以看阿耿老师的lingshi小程序 如图所示&#xff1a;

web学习笔记(五十二)数据库

目录 1. 数据库的相关概念 1.1 什么是数据库 1.2 常见数据库的分类 1.3 传统型数据库的数据组织结构 1.4 补充 2. 使用 SQL 管理数据库 2.1 什么是 SQL&#xff1f; 2.2 SQL 能做什么 2.3 SQL 的 SELECT 语句 2.4 SQL 的 INSERT INTO 语句 2.5 SQL 的 UPDATE 语…

MySQL批量插入,如何判断重复

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 需要把其他库或者E…

PyQt6实战6--高亮

PyQt6实战3--sql查询器-CSDN博客 在sql查询器的基础上添加了sql语法的高亮 运行效果&#xff1a; 代码&#xff1a; 只需要在原来的代码上添加一行 rightTopLayout QVBoxLayout()rightTopLayout.addWidget(QLabel("输入sql:"))self.sql QTextEdit() #加一行高亮&…

清明假期作业

1、实现文件夹的拷贝功能 注意判断被拷贝的文件夹是否存在&#xff0c;如果不存在则提前 不考虑递归拷贝的问题 #include<myhead.h> int my_copy(char* name,const char *p) {char buf[256]"./";strcat(buf,p);strcat(buf,"/");strcat(buf,name);in…