pgsql怎么改表名不影响物化视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pgsql怎么改表名不影响物化视图相关的知识,希望对你有一定的参考价值。

我们常用说的视图一般是指 view,即普通视图;而物化视图则是materialized view(materialized 使物质化,使具体化(materialize 的过去式和过去分词))。两者都是视图,但是名称不一样,说明两者还有有所差异的。下面就来简单介绍一下PostgreSQL中的视图和物化视图的差异。

1.视图

对标实体表,视图其实是个虚拟的表,实际上一个SQL拼接而成的虚拟表(假表),可能是有一个表或者多个表、视图关联而成的复杂的SQL,而这个SQL一般都是select语句(当然也可能是 update、delete 等的语句,但是可能会有诸多限制,而且用视图进行这些操作也不安全,一般也不会这么用,这些不在本文讨论范围内。)。而视图的用途常常用于展示一些用户需要的信息,隐藏一些敏感或者是不重要的数据,汇总一些关键数据展示给用户。

操作:可以像表一样查询视图的字段,也可以当做一个表进行关联查询。
查询底层实现:通过创建视图的语句进行查询,就是每次实时查询底层的表,数据都是实时的。
索引:走表的索引。
参考技术A pgsql怎么改表名不影响物化视图,视图(View):一个名字(视图的名字),对应着一个SQL查询语句。做查询时,把视图的名字当作表名使用,PostgreSQL会使用对应的SQL查询语句替换视图名称,然后做查询,返回最终的结果。 参考技术B 普通视图

数据库中的视图(view)是从一张或多张数据库表查询导出的虚拟表,反映基础表中数据的变化,且本身不存储数据。

2、物化视图【materialized view】

2.1、概念: 物化视图是查询结果集的一份持久化存储,所以它与普通视图完全不同,而非常趋近于表。 可以是基础表中部分数据的一份简单拷贝,也可以是多表join之后产 生的结果或 其子集,或者原始数据的聚合指标等等。所以,物化视图不会随着基础表的变化而变化,所以它也称为快照(snapshot)。

如果要更新数据的话,需要用户手动进行,如周期性执行SQL,或利用触发器等
参考技术C 创建物化视图
2. 刷新物化视图的数据 (1)、即将数据加载到物化视图中。 (2)、刷新物化视图的数据时,或锁定整张表(在大数据量的情况下比较久,会导致其它
3. 删除物化视图

使用物化视图解决GoldenGate不能使用中文表名问题

源端:

conn sh/sh

create table "学生" ("学号" number primary key,"姓名" varchar2(30))

                                               *

ORA-00957: duplicate column name 重复列名

create table "学生" ("学号" number primary key, " 姓名" varchar2(30));

 

create materialized view log on "学生" with primary key;

 

create materialized view mv_student

refresh fast on commit

as

select "学生"."学号" as id, "学生"." 姓名" as name from "学生";

 

添加这个物化视图的附加日志

GGSCI (linux5.5) 1> dblogin userid goldengate, password goldengate

info trandata sh.mv_student

add trandata sh.mv_student

 

SQL> select * from tab;

 

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

TEST                           TABLE

TEST1                          TABLE

TEST4                          TABLE

????                           TABLE

MLOG$_????                     TABLE

RUPD$_????                     TABLE

MV_STUDENT                     TABLE

一个一个指定,不能用模糊匹配,否则物化视图的日志、中文表,物化视图也会复制过去

GGSCI (linux5.5) 3> edit params ext_sh 

TABLE SH.test1;

TABLE SH.test4;

TABLE SH.mv_student;

GGSCI (linux5.5) 5> stop ext_sh

GGSCI (linux5.5) 7> start ext_sh

SQL> desc sh."学生"

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 ????                                      NOT NULL NUMBER

  ????                                              VARCHAR2(30)

 

如果用模糊匹配:

SQL> select * from tab;

 

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

TEST1                          TABLE

TEST4                          TABLE

????                           TABLE

BIN$6TRNVHJWkIHgQKjAqQoNFg==$0 TABLE

MLOG$_????                     TABLE

RUPD$_????                     TABLE

SQL> desc sh."学生"

ORA-00942: table or view does not exist

 

 

目标端

 

 

dblogin userid goldengate, password goldengate

add checkpointtable goldengate.rep_mv_ckpt

add replicat rep_mv,exttrail ./dirdat/d2,checkpointtable rep_mv_ckpt

 

GGSCI (linux5.5) 5> edit params rep_sh

mapexclude sh.mv_student

GGSCI (linux5.5) 7> stop rep_sh

GGSCI (linux5.5) 9> start rep_sh

 

GGSCI (linux5.5) 10> info all

 

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

 

MANAGER     RUNNING                                          

REPLICAT    STOPPED     REP_MV      00:00:00      00:04:37   

REPLICAT    RUNNING     REP_OE      00:00:00      00:00:03   

REPLICAT    RUNNING     REP_SH      00:09:26      00:00:03   

REPLICAT    RUNNING     REP_T1      00:00:00      00:00:01   

REPLICAT    RUNNING     REP_T401    00:00:00      00:00:01   

REPLICAT    RUNNING     REP_T402    00:00:00      00:00:01   

REPLICAT    RUNNING     REP_T403    00:00:00      00:00:01   

 

GGSCI (linux5.5) 7> edit params rep_mv

REPLICAT rep_mv

SETENV (NLS_LANG="American_America.ZHS16GBK")

SETENV (ORACLE_SID=test)

USERID goldengate,PASSWORD goldengate

REPORTCOUNT EVERY 30 MINUTES, RATE

REPERROR DEFAULT, ABEND

numfiles 5000

--HANDLECOLLISIONS

assumetargetdefs

DISCARDFILE ./dirrpt/rep_mv.dsc, APPEND, MEGABYTES 1000

ALLOWNOOPUPDATES

DDL INCLUDE MAPPED

DDLOPTIONS REPORT

map sh.mv_student, target sh.mv_student;

GGSCI (linux5.5) 9> start rep_mv

 

初始化:

conn sh/sh

create table "学生" ("学号" number primary key, " 姓名" varchar2(30));

 

create or replace view mv_student

as

select "学生"."学号" as id, "学生"." 姓名" as name from "学生";

 

 

GGSCI (linux5.5) 10> alter replicat rep_mv, begin now   把以前没有执行的事务直接抛弃掉

 

 

源端:

conn sh/sh

insert into "学生" values (4,‘张三4‘);

commit;

目标端

select * from "学生";

 

以上是关于pgsql怎么改表名不影响物化视图的主要内容,如果未能解决你的问题,请参考以下文章

使用物化视图解决GoldenGate不能使用中文表名问题

oracle物化视图不会自动更新是怎么回事

同名的物化视图和表

如何内省物化视图

Oracle - 物化视图中的视图

视图与物化视图