我有一个大表:CREATE TABLE hh(h int8[] not null, file int8 not null)
和h
字段上的GIN索引(CREATE INDEX ON hh USING gin(h)
)。索引创建大约8分钟,所以我决定将这个大表分成两个或多个表,并在所有这些表上创建索引。
我假设这些索引是并行创建的,我得到了大约双倍的加速比(因为索引和表放在一个磁盘上,所以稍微少了一点)。我假设两张桌子有4-5分钟(而不是一张桌子有10分钟)。
但那没有发生!两个索引都创建了8-9分钟,而不是4-5分钟。
我尝试在其他大表上并行创建B树索引,是的,PostgreSQL可以并行创建这样的索引。所以我认为这也适用于杜松子酒。
我有足够的内存用于索引:32 for。原始表有1Gb大小,原始索引有3Gb大小。分割表的大小为0.5Gb,索引为1.3Gb。maintenance_work_mem = 16Gb
,work_mem = 16Gb
.
我还尝试将第二个表和索引放在另一个表空间(位于其他物理磁盘中),但是加速非常小(7.5分钟对8分钟)。为什么??
那么,如何并行地创建GIN索引呢?这个是可能的吗?
发布于 2018-03-09 22:54:45
为了跟进我的评论,PostgreSQL
绝对可以在不同的表上并行地构建gin
索引。如果你没有看到好处,那是因为你没有足够的资源。可能是随机磁盘IO容量,因为构建大型gin
索引在这方面可能会非常密集。
如果使用不同的表空间没有加快速度,那么IO瓶颈可能在内核或FS代码中,因此无法充分利用底层硬件。更明确地确定瓶颈的一种方法是在同一台机器上运行两个单独的PostgreSQL
服务器(侦听不同的端口),然后在每个数据库服务器中放置一个表,并尝试在设置的服务器上同时创建索引。
https://dba.stackexchange.com/questions/199486
复制相似问题