
理论上在数据库层面是没有限制的,由于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
-------
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)