PostgreSQL初级教程:使用物化视图实现高效大数据查询分析
liebian365 2024-11-05 11:46 22 浏览 0 评论
目录
- 概述
- 原理机制
- 物化视图创建语法说明使用案例初始化数据物化视图使用物化视图刷新数据物化视图删除
- 总结
概述
本节主要分享物化视图(Materialized View)的基础知识,分为原理机制,创建,数据刷新以及删除等内容。
在原理机制部分,会对比普通视图(View)与物化视图(Materialized View)的不同点,分析它们的执行机制差异;后续部分将结合实际案例,展示如何创建、使用、刷新和删除物化视图。
原理机制
1. 普通视图 (View)
普通视图仅记录视图定义时的查询语句。当查询视图时,SQL会被重写,用视图定义的语句进行替换,然后执行查询,实际是从数据表中查询。
执行流程如下:
SELECT * FROM vw_employee; -> 查询优化器 -> 重写为 SELECT * FROM (SELECT * FROM employee) AS vw_employee; -> 执行器 -> 返回结果
每次从视图查询时,都会执行一次视图定义的查询语句,视图本身不会存储数据。
2. 物化视图 (Materialized View)
物化视图在定义时会将数据保存一份,并有自己存储的数据,但不会自动与主表进行数据同步,需要手动进行同步。
执行流程如下:
SELECT * FROM mvw_employee; -> 查询优化器 -> 执行器 -> 返回结果
如果对某视图访问频繁,结果集只需生成一次,之后的查询都是直接查结果集,大大节省时间,尤其是对于大数据分析。
由于物化视图会保存源表的数据,所以它不能被修改,以避免数据的分叉。
物化视图创建
语法说明
物化视图的创建语法如下:
CREATE MATERIALIZED VIEW view_name
AS
query_sql
WITH [NO] DATA;
物化视图创建语法与普通视图类似,区别有:
- 使用关键字 MATERIALIZED 来指示这是一个物化视图。
- 定义的最后使用 WITH DATA 或 WITH NO DATA 来指定创建后的物化视图是否需要同步数据。不指定时默认是 WITH DATA。
使用案例
下面通过一个案例展示如何使用物化视图来提高大数据分析的查询效率。
初始化数据
创建产品与订单表:
-- 创建产品表
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
category VARCHAR(255)
);
-- 创建订单表
CREATE TABLE orders (
order_id INT PRIMARY KEY,
product_id INT,
quantity INT NOT NULL,
region VARCHAR(255) NOT NULL,
order_date DATE NOT NULL,
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
存储过程:生成随机字符串
CREATE OR REPLACE FUNCTION generate_random_string(length INTEGER)
RETURNS VARCHAR
LANGUAGE plpgsql
AS $
DECLARE
result VARCHAR(255) := '';
chars TEXT[] := ARRAY['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
BEGIN
FOR i IN 1..length LOOP
result := result || chars[1 + (random() * (array_length(chars, 1) - 1))::int];
END LOOP;
RETURN result;
END $;
生成10万条商品数据和100万条订单数据:
-- 生成商品数据
INSERT INTO products (product_id, product_name, price, category)
SELECT
id, generate_random_string(10),
(random() * 1000)::numeric(10,2),
'Category' || (random() * 10)::int
FROM generate_series(1, 100000) AS id;
-- 生成订单数据
INSERT INTO orders (order_id, product_id, quantity, region, order_date)
SELECT
id, 1 + random()*99999,
(random() * 10000)::int,
'region' || (random() * 22)::int,
current_date - floor((random() * 360))::int rand_date
FROM generate_series(1, 1000000) AS id;
物化视图使用
创建物化视图:
CREATE MATERIALIZED VIEW mvw_region_sales AS
SELECT region, SUM(quantity) AS total_sales
FROM orders
GROUP BY region;
查询各区域的销量:
SELECT * FROM mvw_region_sales;
经过测试,多次查询销量,可以看到查询速度显著加快。
物化视图刷新数据
当主表数据变化后,需要手动刷新物化视图以同步数据。例如,在订单表中新增一条记录然后刷新物化视图:
INSERT INTO orders VALUES (1000001, 1000, 10000, 'region100', '2023-12-03');
REFRESH MATERIALIZED VIEW mvw_region_sales;
查看新数据:
SELECT * FROM mvw_region_sales WHERE region = 'region100';
如需并发刷新物化视图,可以使用 CONCURRENTLY 关键字,但前提是物化视图有唯一性索引列:
REFRESH MATERIALIZED VIEW CONCURRENTLY mvw_region_sales;
物化视图删除
删除物化视图的SQL语法:
DROP MATERIALIZED VIEW view_name;
如需级联删除,可以增加 CASCADE 关键字。
总结
在大数据分析场景下,物化视图能高效地缓存中间结果,避免重复计算,显著提升查询效率。
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)