1.数据库集簇逻辑结构
数据库集簇概念:一个大的数据库是由若干个小的数据库组成,实现数据的隔离存放,在概念上应该是与mysql一样的
在mysql中可以用show database列出数据库
PG中用\l
数据库对象存放在数据库中:
PG中的所有数据库对象都有各自的对象表示符oid在内部管理,包括视图,在oracle中的ocp考试中有一道题记得很清楚,说视图有没有自己的oid,答案是有的,视图虽然不占物理空间,依赖于基表,但它也有自己的对象号,在oracle中对象号也叫object_id 也就是oid。
值得注意的是,数据库本身也有一个oid:
2.数据库集簇物理结构
PG 中的数据存放在数据目录中,所有的数据与数据文件都放在这个目录下。
如:
base目录:存放数据实际的物理位置,目录名以数据命名,对应的是PG中各个数据库的oid:
如图,1目录对应的就是template1数据库,13593对应的是postgres数据库。
在PG中一个表就对应一个数据文件,
比如:
插入一条数据
PG为插入的这条数据分配了8192。
可以看出,与oracle一样,PG在创建表的时候也不会为该表立即分配空间,只会在第一次插入数据的时候分配空间,这与oracle 11g之后的延迟段空间创建原理相同。
在oracle中,延迟段空间创建默认开启:
3.PG中的表空间
PG数据库的存放,也是基于表空间的存放,初始化数据库后,默认会创建两个表空间:
pg_defatult,pg_global。
pg_global 在$PGDATA/global目录下,用来存放系统表,如数据字典。
pg_defatult,在$PGDATA/base目录下,创建数据库的时候,如果不指定表空间,则会使用pg_default表空间
可以这么理解,PG中各个数据库都是以表空间的形式存放在磁盘中的,有了表空间,数据就可以存放在不同的位置,当然,一个表空间可以对应多个数据库,如pg_default表空间默认就存放了template0和template2两个数据库。
4.创建表空间
在PG中,创建数据库和创建表的时候都可以指定表空间。
测试在家目录创建一个表空间:
可以看到家目录创建了一个表空间文件,在pg_tblspc中有一个软链接指向家目录的表空间文件。
创建表的时候也可以指定表空间,用哪个数据库创建的表,这个表属于哪个数据库,但是不属于这个数据库的表空间,这张表属于你自己指定的表空间,因此在管理的时候可能会比较混乱,但在某些情况下,想要把核心的表放到磁盘IO较好的磁盘上,可以使用创建表指定表空间这种方式。
可以看到,与oracle不同,PG中创建表空间指定一个目录,oracle创建表空间需要指定数据文件,oracle中表空间只是逻辑上的概念,在物理上都是以数据文件的形式存储,而PG中表空间是以物理的形式存储,我们创建一个表空间,在物理磁盘上就能找到该表空间指定的目录。