PostgreSQL/Greenplum数据库的物化视图

一、物化视图(MATERIALIZED VIEW)

1、PG的版本

PostgreSQL 9.3 版本之后开始支持物化视图。

2、与普通视图的区别

View 视图:虚拟,不存在实际的数据,在查询视图的时候其实是对视图内的表进行查询操作。

物化视图:实际存在,将数据存成一张表,查询的时候对这个表进行操作。物化视图内的数据需要和表的数据进行同步,这就是refresh。

二、实际操作

1、实验环境:

数据库版本:PostgreSQL 9.6.17 及 Greenplum 6.10.1

2、初始化数据

创建表,并插入数据:

tangyibo=# create table t1 (id int ,col1 varchar(10),col2 varchar(10));
CREATE TABLE
tangyibo=# create table t2 (id int ,col3 varchar(10), col4 varchar(10), col5 varchar(10));
CREATE TABLE
tangyibo=# insert into t1 values (1,'a','b'),(2,'a','b'),(3,'a','b'),(4,'a','b'),(5,'a','b');
INSERT 0 5
tangyibo=# insert into t2 values (1,'c','d','e'),(2,'c','d','e'),(3,'c','d','e'),(4,'c','d','e'),(5,'c','d','e');
INSERT 0 5
tangyibo=# select * from t1;
 id | col1 | col2
----+------+------
  1 | a    | b
  2 | a    | b
  3 | a    | b
  4 | a    | b
  5 | a    | b
(5 rows)

tangyibo=# select * from t2;
 id | col3 | col4 | col5
----+------+------+------
  1 | c    | d    | e
  2 | c    | d    | e
  3 | c    | d    | e
  4 | c    | d    | e
  5 | c    | d    | e
(5 rows)

tangyibo=#

3、创建物化视图

tangyibo=# CREATE MATERIALIZED VIEW IF NOT EXISTS mv_t1_t2 (t1_id,t2_id, col1,col2,col3,col4,col5) AS SELECT t1.id, t2.id, t1.col1,t1.col2,t2.col3,t2.col4,t2.col5 from t1,t2 where t1.id = t2.id WITH DATA;
SELECT 5
tangyibo=# select * from mv_t1_t2;
 t1_id | t2_id | col1 | col2 | col3 | col4 | col5
-------+-------+------+------+------+------+------
     1 |     1 | a    | b    | c    | d    | e
     2 |     2 | a    | b    | c    | d    | e
     3 |     3 | a    | b    | c    | d    | e
     4 |     4 | a    | b    | c    | d    | e
     5 |     5 | a    | b    | c    | d    | e
(5 rows)

注:在Greenplum中不支持IF NOT EXISTS;

4、刷新物化视图

tangyibo=# insert into t1 values (11,'x','y');
INSERT 0 1
tangyibo=# insert into t2 values (11,'x','y','z');
INSERT 0 1
tangyibo=#

对表进行操作,不改变物化视图中的数据。查询物化视图,数据没有改变:

tangyibo=# select * from mv_t1_t2 ;
 t1_id | t2_id | col1 | col2 | col3 | col4 | col5
-------+-------+------+------+------+------+------
     1 |     1 | a    | b    | c    | d    | e
     2 |     2 | a    | b    | c    | d    | e
     3 |     3 | a    | b    | c    | d    | e
     4 |     4 | a    | b    | c    | d    | e
     5 |     5 | a    | b    | c    | d    | e
(5 rows)

tangyibo=#

(1) 全量更新:

刷新物化视图才能使物化视图的数据改变。

tangyibo=# REFRESH MATERIALIZED VIEW mv_t1_t2 WITH DATA;
REFRESH MATERIALIZED VIEW
tangyibo=# select * from mv_t1_t2 ;
 t1_id | t2_id | col1 | col2 | col3 | col4 | col5
-------+-------+------+------+------+------+------
     1 |     1 | a    | b    | c    | d    | e
     2 |     2 | a    | b    | c    | d    | e
     3 |     3 | a    | b    | c    | d    | e
     4 |     4 | a    | b    | c    | d    | e
     5 |     5 | a    | b    | c    | d    | e
    11 |    11 | x    | y    | x    | y    | z
(6 rows)

tangyibo=#

(2) 增量更新

在PostgreSQL数据库只有当物化视图中存在unique index的时候,refresh物化视图才能使用增量更新,加入concurrently参数。否则报错。

tangyibo=# REFRESH MATERIALIZED VIEW CONCURRENTLY mv_t1_t2 WITH DATA;
ERROR:  cannot refresh materialized view "public.mv_t1_t2" concurrently
HINT:  Create a unique index with no WHERE clause on one or more columns of the materialized view.
tangyibo=# create unique index uidx_mv_id on mv_t1_t2 (t1_id );
CREATE INDEX
tangyibo=# insert into t1 values (12,'xx','yy');
INSERT 0 1
tangyibo=# insert into t2 values (12,'xx','yy','zz');
INSERT 0 1
tangyibo=# REFRESH MATERIALIZED VIEW CONCURRENTLY mv_t1_t2 WITH DATA;
REFRESH MATERIALIZED VIEW
tangyibo=# select * from mv_t1_t2 ;
 t1_id | t2_id | col1 | col2 | col3 | col4 | col5
-------+-------+------+------+------+------+------
     1 |     1 | a    | b    | c    | d    | e
     2 |     2 | a    | b    | c    | d    | e
     3 |     3 | a    | b    | c    | d    | e
     4 |     4 | a    | b    | c    | d    | e
     5 |     5 | a    | b    | c    | d    | e
    11 |    11 | x    | y    | x    | y    | z
    12 |    12 | xx   | yy   | xx   | yy   | zz
(7 rows)

tangyibo=#

在Greenplum数据库中,需要唯一索引与分布式键兼容,否在会报:UNIQUE and DISTRIBUTED RANDOMLY are incompatible

虽然在PostgreSQL数据库中可以用WITH NO DATA刷新物化视图,但是在查询时会报错:

tangyibo=# REFRESH MATERIALIZED VIEW mv_t1_t2 WITH NO DATA;
REFRESH MATERIALIZED VIEW
tangyibo=# select * from mv_t1_t2 ;
ERROR:  materialized view "mv_t1_t2" has not been populated
HINT:  Use the REFRESH MATERIALIZED VIEW command.
tangyibo=# REFRESH MATERIALIZED VIEW mv_t1_t2 WITH DATA;
REFRESH MATERIALIZED VIEW
tangyibo=# select * from mv_t1_t2 ;
 t1_id | t2_id | col1 | col2 | col3 | col4 | col5
-------+-------+------+------+------+------+------
     1 |     1 | a    | b    | c    | d    | e
     2 |     2 | a    | b    | c    | d    | e
     3 |     3 | a    | b    | c    | d    | e
     4 |     4 | a    | b    | c    | d    | e
     5 |     5 | a    | b    | c    | d    | e
    11 |    11 | x    | y    | x    | y    | z
    12 |    12 | xx   | yy   | xx   | yy   | zz
(7 rows)

tangyibo=#

 

### SQLi Labs 靶场教程详解 #### SQLi Labs靶场概述 SQLi Labs是一个用于学习和实践SQL注入技术的Web应用程序集合。该平台设计了一系列不同难度级别的挑战,帮助安全研究人员理解和掌握各种类型的SQL注入漏洞利用方法。 #### 数值型SQL注入实例解析 对于数值型SQL注入攻击,在`Less-2`这一卡中,当向URL参数`id`附加单引号(`http://10.10.10.129/Less-2/?id=1'`)时可以触发异常响应[^2]。这种行为表明服务器端未正确处理特殊字符输入,从而可能允许攻击者构造特定查询语句来操控后台数据库逻辑。 #### 自动化工具辅助下的高级技巧展示 针对更复杂的场景比如`Less-15`,可以通过配置并运行sqlmap这样的自动化渗透测试软件来进行高效检测与利用。具体操作上会涉及到设置合适的选项如指定目标文件路径以及所需获取的信息类型等命令行参数[^1]。 ```bash python sqlmap.py -u "http://example.com/vulnerable.php?id=1" --batch --dump ``` 上述脚本展示了如何使用sqlmap批量模式自动探测并导出受影响表内的全部数据记录。 #### POST请求方式下SQL注入实战演练 在面对基于POST提交的数据交互形式时,则需借助Burp Suite这类中间人代理工具先行拦截并修改HTTP流量后再传递给sqlmap进一步分析处理。例如`Less-12`里提到的方法就是先保存包含恶意负载的消息体至本地文本文件再作为源码供给后续步骤调用[^4]。 #### 成功实施SQL注入的前提条件说明 要成功发动一次有效的SQL注入攻击至少满足三项基本要素:一是存在可被外部篡改影响内部流程走向的键变量;二是缺乏足够的防护措施使得非法指令得以顺利传达至解释引擎层面;三是整个业务逻辑确实依赖系型存储机制完成核心功能实现过程中的某些环节[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值