我的 PSQL 数据库性能是否在我的硬件预期范围内?
Is my PSQL database performance within expectations for my hardware?
我对数据库管理的概念是全新的,所以我没有任何基础可以期待什么。我正在以五个不同表格的形式处理大约 100GB 的数据。可以找到数据说明以及每个文件的前几行 here。
我目前正在使用 flows
表来衡量性能。这是 \d flows
:
的结果
Table "public.flows"
Column | Type | Modifiers
------------+-------------------+-----------
time | real |
duration | real |
src_comp | character varying |
src_port | character varying |
dest_comp | character varying |
dest_port | character varying |
protocol | character varying |
pkt_count | real |
byte_count | real |
Indexes:
"flows_dest_comp_idx" btree (dest_comp)
"flows_dest_port_idx" btree (dest_port)
"flows_protocol_idx" btree (protocol)
"flows_src_comp_idx" btree (src_comp)
"flows_src_port_idx" btree (src_port)
这是 EXPLAIN ANALYZE SELECT src_comp, COUNT(DISTINCT dest_comp) FROM flows GROUP BY src_comp;
的结果,我认为这是一个相对简单的查询:
GroupAggregate (cost=34749736.06..35724568.62 rows=200 width=64) (actual time=1292299.166..1621191.771 rows=11154 loops=1)
Group Key: src_comp
-> Sort (cost=34749736.06..35074679.58 rows=129977408 width=64) (actual time=1290923.435..1425515.812 rows=129977412 loops=1)
Sort Key: src_comp
Sort Method: external merge Disk: 2819360kB
-> Seq Scan on flows (cost=0.00..2572344.08 rows=129977408 width=64) (actual time=26.842..488541.987 rows=129977412 loops=1)
Planning time: 6.575 ms
Execution time: 1636290.138 ms
(8 rows)
如果我正确地解释了这一点(我可能不正确,因为我是 PSQL 的新手),那就是说我的查询将花费将近 30 分钟的时间来执行,这比我预期的要长得多.即使有约 1.3 亿行。
我的电脑是 运行 第 8 代 i7 四核 CPU、16GB RAM 和 2TB 硬盘(可以找到完整规格 here)。
我的问题是:1) 这种性能是否符合预期,以及 2) 除了购买外部 SSD 之外,我还能做些什么来加快速度?
1 - 查询使用的 src_comp 和 dest_comp 均已编入索引。但是,它们是独立索引的。如果您有 'src_comp, dest_comp' 的索引,那么数据库可能会通过索引处理这一切,从而消除完整的 table 扫描。
2 - src_comp 和 dest_comp 是字符变化的。除非必要,否则这对索引字段来说不是一件好事。这些价值观到底是什么?数字? IP地址?计算机网络名称?如果这些项目的数量相对有限,并且在将它们添加到数据库时可以识别它们,请将它们更改为整数,用作其他 table 的外键。这将在此查询中产生巨大的差异。如果它们不能以这种方式存储,但它们至少有一个确定的有限长度——例如,点分四边形格式的 IPv4 地址为 15 个字符——然后为字段设置最大长度,这应该会有所帮助。
我对数据库管理的概念是全新的,所以我没有任何基础可以期待什么。我正在以五个不同表格的形式处理大约 100GB 的数据。可以找到数据说明以及每个文件的前几行 here。
我目前正在使用 flows
表来衡量性能。这是 \d flows
:
Table "public.flows"
Column | Type | Modifiers
------------+-------------------+-----------
time | real |
duration | real |
src_comp | character varying |
src_port | character varying |
dest_comp | character varying |
dest_port | character varying |
protocol | character varying |
pkt_count | real |
byte_count | real |
Indexes:
"flows_dest_comp_idx" btree (dest_comp)
"flows_dest_port_idx" btree (dest_port)
"flows_protocol_idx" btree (protocol)
"flows_src_comp_idx" btree (src_comp)
"flows_src_port_idx" btree (src_port)
这是 EXPLAIN ANALYZE SELECT src_comp, COUNT(DISTINCT dest_comp) FROM flows GROUP BY src_comp;
的结果,我认为这是一个相对简单的查询:
GroupAggregate (cost=34749736.06..35724568.62 rows=200 width=64) (actual time=1292299.166..1621191.771 rows=11154 loops=1)
Group Key: src_comp
-> Sort (cost=34749736.06..35074679.58 rows=129977408 width=64) (actual time=1290923.435..1425515.812 rows=129977412 loops=1)
Sort Key: src_comp
Sort Method: external merge Disk: 2819360kB
-> Seq Scan on flows (cost=0.00..2572344.08 rows=129977408 width=64) (actual time=26.842..488541.987 rows=129977412 loops=1)
Planning time: 6.575 ms
Execution time: 1636290.138 ms
(8 rows)
如果我正确地解释了这一点(我可能不正确,因为我是 PSQL 的新手),那就是说我的查询将花费将近 30 分钟的时间来执行,这比我预期的要长得多.即使有约 1.3 亿行。
我的电脑是 运行 第 8 代 i7 四核 CPU、16GB RAM 和 2TB 硬盘(可以找到完整规格 here)。
我的问题是:1) 这种性能是否符合预期,以及 2) 除了购买外部 SSD 之外,我还能做些什么来加快速度?
1 - 查询使用的 src_comp 和 dest_comp 均已编入索引。但是,它们是独立索引的。如果您有 'src_comp, dest_comp' 的索引,那么数据库可能会通过索引处理这一切,从而消除完整的 table 扫描。
2 - src_comp 和 dest_comp 是字符变化的。除非必要,否则这对索引字段来说不是一件好事。这些价值观到底是什么?数字? IP地址?计算机网络名称?如果这些项目的数量相对有限,并且在将它们添加到数据库时可以识别它们,请将它们更改为整数,用作其他 table 的外键。这将在此查询中产生巨大的差异。如果它们不能以这种方式存储,但它们至少有一个确定的有限长度——例如,点分四边形格式的 IPv4 地址为 15 个字符——然后为字段设置最大长度,这应该会有所帮助。