PostgreSQL初级教程:使用物化视图实现高效大数据查询分析
liebian365 2024-11-05 11:46 5 浏览 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 关键字。
总结
在大数据分析场景下,物化视图能高效地缓存中间结果,避免重复计算,显著提升查询效率。
相关推荐
- 快递查询教程,批量查询物流,一键管理快递
-
作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...
- 一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递
-
对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...
- 快递查询单号查询,怎么查物流到哪了
-
输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...
- 3分钟查询物流,教你一键批量查询全部物流信息
-
很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...
- 快递单号查询,一次性查询全部物流信息
-
现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...
- 快递查询工具,批量查询多个快递快递单号的物流状态、签收时间
-
最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...
- 快递查询软件,自动识别查询快递单号查询方法
-
当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...
- 教你怎样查询快递查询单号并保存物流信息
-
商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...
- 简单几步骤查询所有快递物流信息
-
在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...
- 物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号
-
最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...
- 连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息
-
快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...
- 快递查询教程,快递单号查询,筛选更新量为1的单号
-
最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...
- 掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析
-
在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...
- 从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息
-
在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...
- 物流单号查询,在哪里查询快递
-
如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)