欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PostgreSQL子表和分区表的对比介绍

程序员文章站 2022-05-02 11:55:43
从整体上来看,子表和分区表有相同的地方也有差别,因为都使用了继承的特性,所以本质上是一样的。下面看一下二者的区别: 1.父子表: --创建父表 create table cities (...

从整体上来看,子表和分区表有相同的地方也有差别,因为都使用了继承的特性,所以本质上是一样的。下面看一下二者的区别:

1.父子表:

--创建父表
create table cities (   
        name        text,
        population float,
        altitude     int
);
--创建子表
create table capitals ( 
        state      char(2)
) inherits (cities);
insert into cities values('las vegas', 1.53, 2174);  --插入父表
insert into cities values('mariposa',3.30,1953);     --插入父表
insert into capitals values('madison',4.34,845,'wi');--插入子表
--在父表上做查询,父表和子表的数据均被取出。
select name, altitude from cities where altitude > 500; 
las vegas	2174
mariposa	1953
madison	        845
--查看执行计划,实际上查询从扫描了两个表的数据,组合出想要的结果
explain analyze select name,altitude from  cities where altitude > 500;
append  (cost=0.00..24.54 rows=361 width=36) (actual time=0.008..0.012 rows=3 loops=1)
  ->  seq scan on cities  (cost=0.00..2.41 rows=38 width=36) (actual time=0.007..0.008 rows=2 loops=1)
        filter: (altitude > 500)
  ->  seq scan on capitals  (cost=0.00..22.12 rows=323 width=36) (actual time=0.001..0.001 rows=1 loops=1)
        filter: (altitude > 500)
planning time: 0.096 ms
execution time: 0.044 ms
--在子表上做查询,只能查出子表上的数据。
select name, altitude from capitals where altitude > 500;
--如果只想从父表中取数据,则需要在sql中加入only关键字,如:
select name,altitude from only cities where altitude > 500;

从这个例子看一看出,父子表使用了继承的特性,子表可以增加字断,另外子表可以继承于多个父表。但是仍然有个疑问,有什么卵用呢??

2.分区表:

分区表也是使用继承的特性,在逻辑上把一个大表分成几块数据,分区的字断和主表字断一致,不会再另行增加字断,另外可以人为定义约束,来约束每个表上的数据不重复。

--创建主表示例:
create table measurement (           
        city_id      int    not null,
        logdate     date  not null,
        peaktemp int
); 
--创建几个子表,继承父表所有字断:
create table measurement_yy04mm02 (
        check ( logdate >= date '2004-02-01' and logdate < date '2004-03-01')
    ) inherits (measurement);
    create table measurement_yy04mm03 (
        check (logdate >= date '2004-03-01' and logdate < date '2004-04-01')
    ) inherits (measurement);
    ...
    create table measurement_yy05mm11 (
        check (logdate >= date '2005-11-01' and logdate < date '2005-12-01')
    ) inherits (measurement);
    create table measurement_yy05mm12 (
        check (logdate >= date '2005-12-01' and logdate < date '2006-01-01')
    ) inherits (measurement);
    create table measurement_yy06mm01 (
        check (logdate >= date '2006-01-01' and logdate < date '2006-02-01')
    ) inherits (measurement);    

从这个例子看出,分区表完全继承主表字断,并且不另外增加字断,每个分区表上定义好约束,保证数据不要发生重叠。分区表在生产上还是很有用的,可以提高查询效率。