postgresql9.5 物化视图测试

视图是指数据库只存储定义该视图的查询语句(内容是查询时产生),而物化视图是一个其查询语句查询后的内容并存储的视图(内容是创建物化视图刷新视图时产生,数据可修改。独立)。因为物化视图是视图的一个物化表结构,但是里面的数据是创建时刷新查询到额数据,当原数据更新修改时如果物化视图的表没有更新会造成数据的不一致。从9.4开始增加增量刷新,9.5的版本中支持物化视图也支持索引,修改表空间,指定用户访问权限

postgresql9.5物化视图测试:

search package: sudo apt-cache search dtrace-*

dtrac && readline install :sudo apt-get install systemtap-sdt-dev libssl-dev libpam-dev libxml2-dev libxslt-dev  libtcl8.4  libperl-dev python-dev

./configure --prefix=/home/pg5/pgsql9.5-devel --with-port=5433 --with-perl --without-tcl --with-python --with-openssl --with-pam --without-ldap --with-libxml --with-libxslt  --enable-thread-safety --with-blocksize=32 --enable-dtrace --enable-debug

make

sudo make install

cd postgresql源码目录/contrib

make

sudo make install(后面要用到fdw)

.bashrc的环境变量要配置:

export PGHOME=/home/pg5/pgsql9.5-devel
export PATH=$PATH:$PGHOME/bin
export PGDATA=/home/pg5/data
export PGUSER=pg5
export PGPORT=5433

测试数据:

create database eachma;
create table tbl(id int primary key,info text,crt_time timestamp);
insert into tbl select generate_series(1,100000),md5(random()::text),clock_timestamp();
 create materialized view tbl_view as select * from tbl where id<1000 with no data;
 create materialized view tbl_view1 as select * from tbl with no data;
 create unique index idx_tbl_view_id on tbl_view(id);
 create unique index idx_tbl_view1_id on tbl_view1(id);
 refresh materialized view tbl_view;
 refresh materialized view tbl_view1;
 \timing #打开事务执行时间

增量刷新;refresh materialized view concurrently tbl_view1;

非增量刷新:refresh materialized view  tbl_view1;

pg中查看物化视图表:

select * from pg_matviews;

eachma=# select * from pg_matviews;
-[ RECORD 1 ]+-------------------------
schemaname   | public
matviewname  | tbl_view
matviewowner | pg5
tablespace   |
hasindexes   | t
ispopulated  | t
definition   |  SELECT tbl.id,         +
             |     tbl.info,           +
             |     tbl.crt_time        +
             |    FROM tbl             +
             |   WHERE (tbl.id < 1000);
-[ RECORD 2 ]+-------------------------
schemaname   | public
matviewname  | tbl_view1
matviewowner | pg5
tablespace   |
hasindexes   | t
ispopulated  | t
definition   |  SELECT tbl.id,         +
             |     tbl.info,           +
             |     tbl.crt_time        +
             |    FROM tbl;

Time: 0.758 ms

增量刷新不会锁表,阻断其他查询。但是视图的非增量刷新会锁表。两者利弊不一,前者不锁表,但是执行需要的时间比较长,因为是Join查询需要一条条的数据进行对比,以时间来换取查询锁。以至于不会影响到物化视图的查询工作 。而后者的执行等待时间比较短.但其他的查询需要等待刷新之后才能完成:

增量刷新:

eachma=# begin;
BEGIN
Time: 0.117 ms
eachma=# refresh materialized view concurrently tbl_view1;
REFRESH MATERIALIZED VIEW
Time: 2085.527 ms
eachma=# commit;
COMMIT
Time: 2.718 ms
eachma=# end
#非增量刷新
eachma=# begin;
BEGIN
Time: 0.104 ms
eachma=# refresh materialized view tbl_view1;
REFRESH MATERIALIZED VIEW
Time: 209.312 ms
eachma=# commit;
COMMIT
Time: 9.777 ms
eachma=# end;
WARNING:  there is no transaction in progress
COMMIT
Time: 0.318 ms

pg是支持外部表物化视图。例如oracle里面有一个表的数据是我们想需要的,但是一般情况下是需要我们通过odbc或者是dump出来。但是因为pg支持外部表(FDW,dblink)。可以通过创建一个我们需要oracle中数据,那么可以先创建一个外部表,然后给这个外部表创建物化视图,这样也减少的数据的拷贝,oracle有数据更新时也可以去更新视图。但要注意物化视图的表增量的刷新要与远程表规则一致(索引)

eachma=# CREATE EXTENSION postgres_fdw;

安装成功:

eachma=# \df
                                 List of functions
 Schema |          Name          | Result data type | Argument data types |  Type
--------+------------------------+------------------+---------------------+--------
 public | postgres_fdw_handler   | fdw_handler      |                     | normal
 public | postgres_fdw_validator | void             | text[], oid         | normal

参考:http://www.postgresql.org/docs/9.5/static/postgres-fdw.html

时间: 2024-10-11 16:48:05

postgresql9.5 物化视图测试的相关文章

测试mv刷新组是否可以同时刷新组内物化视图

我们知道刷新组的目的是为了解决外键关系表刷新先后的问题,从这个目的出发,说明刷新组内物化视图刷新是串行的. 我通过触发器的方式,监控了一下这个现象. 同时也说明了刷新组内,物化视图的刷新并不能并行. --创建物化视图日志 CREATE TABLE POLICY (ID INTEGER PRIMARY KEY , PRODUCT_NAME VARCHAR2(200)); CREATE TABLE AGENT (agent_code VARCHAR2(30) PRIMARY KEY , NAME V

oracle物化视图

原文URL: oracle 10g物化视图简介 2012-05-09 17:33:55|  分类: ORACLE性能 |  标签:oracle  物化视图  |举报|字号 订阅 下载LOFTER我的照片书  | 环境oracle 10g 10.2.0.4  linux 64 要大而专业的看oracle自己的文档-sql参考. 说实话,oracle需要学习的内容太多,每个都看过去,实在太费事. 所以如果能够对物化视图有个概览,那最方便不过. 主要涉及内容 物化视图日志,用于快速刷新所必须的 物化视

[转载]oracle物化视图

原文URL:http://lzfhope.blog.163.com/blog/static/636399220124942523943/?suggestedreading&wumii 环境oracle 10g 10.2.0.4  linux 64 要大而专业的看oracle自己的文档-sql参考. 说实话,oracle需要学习的内容太多,每个都看过去,实在太费事. 所以如果能够对物化视图有个概览,那最方便不过. 主要涉及内容 物化视图日志,用于快速刷新所必须的 物化视图 权限,通常不是个难题,因

【PostgreSQL】物化视图

PostgreSQL 9.3 以后出现了物化视图.物化视图是由实实在在的数据组成,这是和一般视图的根本区别. 1. 物化视图创建语法如下: --创建语法 CREATE MATERIALIZED VIEW table_name [ (column_name [, ...] ) ] [ WITH ( storage_parameter [= value] [, ... ] ) ] [ TABLESPACE tablespace_name ] AS query [ WITH [ NO ] DATA ]

oracle中使用物化视图实现表的同步

表的同步可以使用物化视图来实现,可以是同库的也可以是不同数据库之间进行数据同步,建议在同库的数据同步可以使用实时的同步,如果使用db link建议使用增量的刷新方式,防止dblink导致原库的性能急剧下降. 主要步骤: 1.在原表上建立物化视图日志 2.在创建目标表 3.创建与目标表同名的物化视图日志 1.创建原表和物化视图日志 SQL> conn bre/bre Connected. SQL> create table t1(id int,name varchar2(30)); Table

oracle物化视图快速更新

建立测试表 create table T_table nologging as select * from dba_objects; create table t_table_1 nologging as select * from dba_tables; --建立日志记录 create materialized view log on T_table with rowid ,sequence(object_name,object_type,owner) including new values

TimesTen与Materialized View(物化视图)

今天和用户交流,用户突然问到,TimesTen可否缓存多个Oracle的表,也即将多个表Join的结果缓存? 我们先做几个实验,然后再看有什么解决方法. TimesTen数据库对于物化视图的支持 先建立基础表和 Materialized View. CREATE TABLE customer(custId int not null, custName varchar(100) not null, Addr varchar(100), Zip int, Region varchar(10), PR

通过案例学调优之--跨库建立物化视图(Materialized View)

应用环境: 操作系统: RedHat EL55 Oracle:   Oracle 10gR2 一.物化视图概述 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照. 物化视图可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果.物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能:物化视图对应用透明

SQL Server索引视图以(物化视图)及索引视图与查询重写

经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感觉, SQL Server也有类似于Oracle物化视图的功能,只不过叫做索引视图. 说实话,还是物化视图听起来比较合适,与普通视图比,物化视图就是直接将数据存储起来了 SQL Server中的索引视图也具有查询重写的功能, 所谓的查询重写,就是如果符合条件的数据在索引视图上,并且查询列都包含在在索引视图上,此时可以直接通过查询索引视图来替代基于原始表的查询 依旧惯例,先上代码做一个测试环境 -