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怎么改表名不影响物化视图的主要内容,如果未能解决你的问题,请参考以下文章