需要有关如何在 PostgresQL 中处理大 table 的建议
Need suggestion on how to handle large table in PostgresSQL
我有一个大小为 32Gb 的 table,Postgres 中的索引大小约为 38Gb。
我有一个未编入索引的列 x
。
table 大小以每周 1GB 的速度增长。
x
列上有很多查询 运行。
在这个 table 上针对列 x
的每个查询都消耗了我 CPU 的 17%,并占用了大约。 5~6秒 return 数据库负载较重的数据。
处理此问题的最佳方法是什么?行业标准是什么?
我为列 x
建立了索引,索引的大小增加了 2GB — 查询时间减少到约 100 毫秒。
我正在研究 DynamoDB 以复制 table 的数据,但我不确定这是否是正确的方法,因此提出了这个问题。
我希望数据访问速度更快,同时请记住这会导致功能出现瓶颈。
此处请求的是 运行s:
的查询
database_backup1=> EXPLAIN ANALYZE SELECT * FROM "table_name" WHERE "table_name"."x" IN ('ID001', 'ID002', 'ID003', 'ID004', 'ID005') LIMIT 1;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------
Limit (cost=0.00..56442.83 rows=100 width=1992) (actual time=0.010..155288.649 rows=7 loops=1)
-> Seq Scan on "table_name" (cost=0.00..691424.62 rows=1225 width=1992) (actual time=0.009..155288.643 rows=7 loops=1)
Filter: ((x)::text = ANY ('{ID001,ID002,ID003,ID004,ID005}'::text[]))
Rows Removed by Filter: 9050574
Planning time: 0.196 ms
Execution time: 155288.691 ms
(6 rows)
执行计划表明您的索引显然是正确的选择。
如果你运行经常查询,那么在存储space和索引这样的数据修改性能上付出代价是值得的。
当然我不能权威地说,但我不相信其他数据库系统有灵丹妙药可以让一切变得更快。如果您的数据适合关系模型,PostgreSQL 将是一个不错的选择。
我有一个大小为 32Gb 的 table,Postgres 中的索引大小约为 38Gb。
我有一个未编入索引的列 x
。
table 大小以每周 1GB 的速度增长。
x
列上有很多查询 运行。
在这个 table 上针对列 x
的每个查询都消耗了我 CPU 的 17%,并占用了大约。 5~6秒 return 数据库负载较重的数据。
处理此问题的最佳方法是什么?行业标准是什么?
我为列 x
建立了索引,索引的大小增加了 2GB — 查询时间减少到约 100 毫秒。
我正在研究 DynamoDB 以复制 table 的数据,但我不确定这是否是正确的方法,因此提出了这个问题。
我希望数据访问速度更快,同时请记住这会导致功能出现瓶颈。
此处请求的是 运行s:
的查询database_backup1=> EXPLAIN ANALYZE SELECT * FROM "table_name" WHERE "table_name"."x" IN ('ID001', 'ID002', 'ID003', 'ID004', 'ID005') LIMIT 1;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------
Limit (cost=0.00..56442.83 rows=100 width=1992) (actual time=0.010..155288.649 rows=7 loops=1)
-> Seq Scan on "table_name" (cost=0.00..691424.62 rows=1225 width=1992) (actual time=0.009..155288.643 rows=7 loops=1)
Filter: ((x)::text = ANY ('{ID001,ID002,ID003,ID004,ID005}'::text[]))
Rows Removed by Filter: 9050574
Planning time: 0.196 ms
Execution time: 155288.691 ms
(6 rows)
执行计划表明您的索引显然是正确的选择。
如果你运行经常查询,那么在存储space和索引这样的数据修改性能上付出代价是值得的。
当然我不能权威地说,但我不相信其他数据库系统有灵丹妙药可以让一切变得更快。如果您的数据适合关系模型,PostgreSQL 将是一个不错的选择。