PostgreSQL一个数据库最大支持多少个表?

PostgreSQL一个数据库最大支持多少个表?,第1张

回答之前我得先告诉你数据库的容量才好说到表.

理论上在数据库层面是没有限制的,由于PG 的表是以文件形式存储,

这个问题可转换成文件系统文件数的限制。

所以说不限制数据库的数量.

至于数据库的表,你可以查阅手册

上面有明确说明

支持表大小最大为 32 TB

综上所述,只要你存的下,爱放多少就放多少.

1. 概述

cstore_fdw实现了 PostgreSQL 数据库的列式存储。列存储非常适合用于数据分析的场景,数据分析的场景下数据是批量加载的。

这个扩展使用了Optimized Row Columnar (ORC)数据存储格式,ORC改进了Facebook的RCFile格式,带来如下好处:

压缩:将内存和磁盘中数据大小削减到2到4倍。可以扩展以支持不同压缩算法。

列投影:只提取和查询相关的列数据。提升IO敏感查询的性能。

跳过索引:为行组存储最大最小统计值,并利用它们跳过无关的行。

2. 使用

cstore_fdw的安装和使用都非常简单,可以参考官方资料。

thub.com/citusdata/cstore_fdw

注)注意cstore_fdw只支持PostgreSQL9.3和9.4 。

下面做几个简单的性能对比,看看cstore_fdw究竟能带来多大的性能提升。

2.1 数据加载

2.1.1 普通表

CREATE TABLE tb1

(

id int,

c1 TEXT,

c2 TEXT,

c3 TEXT,

c4 TEXT,

c5 TEXT,

c6 TEXT,

c7 TEXT,

c8 TEXT,

c9 TEXT,

c10 TEXT

)

注:要和普通表的全表扫描作对比,所以不建主键和索引。

[postgres@node2 chenhj]$ time psql -p 40382 -At -F, -c "select id,id::text,id::text,id::text,id::text,id::text,id::text,id::text,id::text,id::text,id::text from generate_series(1,10000000) id"|time psql -p 40382 -c "copy tb1 from STDIN with CSV"

COPY 10000000

1.56user 1.00system 6:42.39elapsed 0%CPU (0avgtext+0avgdata 7632maxresident)k

776inputs+0outputs (17major+918minor)pagefaults 0swaps

real6m42.402s

user0m15.174s

sys 0m14.904s

postgres=# select pg_total_relation_size('tb1'::regclass)

pg_total_relation_size

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

1161093120

(1 row)

postgres=# \timing

Timing is on.

postgres=# analyze tb1

ANALYZE

Time: 11985.070 ms

插入1千万条记录,数据占用存储大小1.16G,插入耗时6分42秒,分析耗时12秒。

2.1.2 cstore表

$ mkdir -p /home/chenhj/data94/cstore

CREATE EXTENSION cstore_fdw

CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw

CREATE FOREIGN TABLE cstb1

(

id int,

c1 TEXT,

c2 TEXT,

c3 TEXT,

c4 TEXT,

c5 TEXT,

c6 TEXT,

c7 TEXT,

c8 TEXT,

c9 TEXT,

c10 TEXT

)

SERVER cstore_server

OPTIONS(filename '/home/chenhj/data94/cstore/cstb1.cstore',

compression 'pglz')

[postgres@node2 chenhj]$ time psql -p 40382 -At -F, -c "select id,id::text,id::text,id::text,id::text, www.hnnedu.com id::text,id::text,id::text,id::text,id::text,id::text from generate_series(1,10000000) id"|time psql -p 40382 -c "copy cstb1 from STDIN with CSV"

COPY 10000000

1.53user 0.78system 7:35.15elapsed 0%CPU (0avgtext+0avgdata 7632maxresident)k

968inputs+0outputs (20major+920minor)pagefaults 0swaps

real7m35.520s

user0m14.809s

sys 0m14.170s

[postgres@node2 chenhj]$ ls -l /home/chenhj/data94/cstore/cstb1.cstore

-rw------- 1 postgres postgres 389583021 Jun 23 17:32 /home/chenhj/data94/cstore/cstb1.cstore

postgres=# \timing

Timing is on.

postgres=# analyze cstb1

ANALYZE

Time: 5946.476 ms

插入1千万条记录,数据占用存储大小390M,插入耗时7分35秒,分析耗时6秒。

使用cstore列存储后,数据占用存储大小降到普通表的3分之1。需要说明的是,由于所有TEXT列填充了随机数据,压缩率不算高,某些实际的应用场景下压缩效果会比这更好。

2.2 Text列的like查询性能对比

2.2.1 普通表

清除文件系统缓存,并重启PostgreSQL

[postgres@node2 chenhj]$ pg_ctl -D /home/chenhj/data94 -l logfile94 restart

[root@node2 ~]# free

total used free sharedbuffers cached

Mem: 2055508 7713561284152 0 9900 452256

-/+ buffers/cache: 3092001746308

Swap: 4128760 3876243741136

[root@node2 ~]# echo 1 >/proc/sys/vm/drop_caches

[root@node2 ~]# free

total used free sharedbuffers cached

Mem: 2055508 3267881728720 0228 17636

-/+ buffers/cache: 3089241746584

Swap: 4128760 3819123746848

对Text列执行like查询

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.800.000.383.420.00 95.40

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 58.55 330.68 212.0873514414714848

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where c1 like '%66'"

count

--------

100000

(1 row)

real0m7.051s

user0m0.001s

sys 0m0.004s

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.800.000.383.430.00 95.39

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 58.90 381.53 211.9084895974714956

耗时7.1秒,产生IO读1.14G,IO写108K。

不清文件系统缓存,不重启PostgreSQL,再执行一次。消耗时间降到1.6秒,几乎不产生IO。

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.800.000.383.430.00 95.39

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 58.81 332.20 213.0673503014714364

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where c1 like '%66'"

count

--------

100000

(1 row)

real0m1.601s

user0m0.002s

sys 0m0.001s

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.800.000.383.430.00 95.38

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 58.80 332.12 213.0173503374714364

2.2.2 cstore表

清除文件系统缓存,并重启PostgreSQL

[postgres@node2 chenhj]$ pg_ctl -D /home/chenhj/data94 -l logfile94 restart

[root@node2 ~]# echo 1 >/proc/sys/vm/drop_caches

对Text列执行like查询

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.800.000.383.380.00 95.45

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 58.12 376.42 209.0484920174716048

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from cstb1 where c1 like '%66'"

count

--------

100000

(1 row)

real0m2.786s

user0m0.002s

sys 0m0.003s

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.800.000.383.380.00 95.44

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 58.12 378.75 208.8985507614716048

耗时2.8秒,产生IO读59M,IO写0K。执行时间优化的虽然不是太多,但IO大大减少,可见列投影起到了作用。

不清文件系统缓存,不重启PostgreSQL,再执行一次。消耗时间降到1.4秒,几乎不产生IO。

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.800.000.383.360.00 95.47

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 57.75 376.33 207.5885508094716524

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from cstb1 where c1 like '%66'"

count

--------

100000

(1 row)

real0m1.424s

user0m0.002s

sys 0m0.001s

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.800.000.383.360.00 95.47

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 57.70 375.96 207.3885508094716588

2.3 对Int列执行=查询

2.3.1 普通表

清除文件系统缓存,并重启PostgreSQL后

[postgres@node2 chenhj]$ pg_ctl -D /home/chenhj/data94 -l logfile94 restart

[root@node2 ~]# echo 1 >/proc/sys/vm/drop_caches

对Int列执行=查询

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.790.000.373.330.00 95.50

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 57.25 373.21 205.6785608974717624

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where id =666666"

count

-------

1

(1 row)

real0m6.844s

user0m0.002s

sys 0m0.006s

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.790.000.373.340.00 95.49

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 57.60 422.57 205.5496991614717708

耗时6.8秒,产生IO读1.14G,IO写84K

不清缓存,再执行一次。消耗时间降到1.1秒,几乎不产生IO。

[postgres@node2 chenhj]$ iostat -k dm-2

Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14_x86_64_(2 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.790.000.373.330.00 95.50

Device:tpskB_read/skB_wrtn/skB_readkB_wrtn

dm-2 57.44 421.37 204.9796991774718032

[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where id =666666"

count

-------


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9933095.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存