在创建数据库并且指定表空间时候,有两种方式,对这两种方式进行了对比,发现了一些问题,分享给大家。
前提:文件空间以及相关表空间都创建完了, 文件空间为ccdb_fs,表空间为ts_ccdb_01,关于文件空间和表空间的创建可参考[新手教程]GP数据库创建文件空间及表空间
情景一:
(1)创建数据库:
create database ccdb;
(2)对创建的数据库进行指定默认表空间:
alter database ccdb set defalut_tablespace=ts_ccdb_01;
(3)查看数据库的默认表空间:
select d.datname,p.spcname from pg_database d, pg_tablespace p where d.datname='ccdb' and p.oid = d.dattablespace;
(4)按照以上进行创建数据库,指定的默认表空间应该还是pg_default
(5)插入表数据函数:
insert into tb01(id) select generate_series(1, 10000000) as id;
(6)查看文件空间对应的目录:
SELECT spcname as tblspc, fsname as filespc,fsedbid as seg_dbid, fselocation as datadir FROM pg_tablespace pgts, pg_filespace pgfs,pg_filespace_entry pgfse WHERE pgts.spcfsoid=pgfse.fsefsoid AND pgfse.fsefsoid=pgfs.oid ORDER BY tblspc, seg_dbid;
(7)会发现pg_system和ccdb_fs都会存在变化
(8)通过pg_tables查看所创建的表的tablespace列为其指定的表空间,即ts_ccdb_01
(9)由此得出按照以上建库并指定表空间,个人认为不妥。
情景二:
(1)创建数据库:
CREATE DATABASE ccdb WITH OWNER = gpadmin ENCODING = 'UTF8' TABLESPACE = ts_ccdb_01 CONNECTION LIMIT = -1;
(2)查看数据库对应的默认表空间
select d.datname,p.spcname from pg_database d, pg_tablespace p where d.datname='ccdb' and p.oid = d.dattablespace;
(3)按照上述进行建库得出的默认表空间应为指定的ts_ccdb_01
(4)查看文件空间目录:
SELECT spcname as tblspc, fsname as filespc,fsedbid as seg_dbid, fselocation as datadir FROM pg_tablespace pgts, pg_filespace pgfs,pg_filespace_entry pgfse WHERE pgts.spcfsoid=pgfse.fsefsoid AND pgfse.fsefsoid=pgfs.oid ORDER BY tblspc, seg_dbid;
(5)进行insert数据观察文件大小变换,发现pg_system无变化,而cmcc_fs一直存在变化
insert into tb01(id) select generate_series(1, 10000000) as id;
(6)通过pg_tables查看所创建的表的tablespace列为空,而不是ts_ccdb_01
(7)按照以上建库,数据存储没有问题,但是pg_tables无显示。
以上两种指定表空间的方式,情景一是通过pg_tables能看到对应的表所在的表空间,但是对应的数据文件变化有问题,而情景二方式指定的表空间是对应的文件空间会变化,也就是数据存储正常,但是在pg_tables里面却看不到所指定的表空间,个人理解感觉还是按照情景二方式指定表空间更好一些,都是个人观点,仅供参考。
评论