如何在Postgres中优化处理`bytea`

时间:2019-05-23 07:12:43

标签: database postgresql database-performance bitcoin cryptocurrency

我正在研究一种将区块链数据转储到Postgres中的Bitcoin Indexer

我以前有一个使用SERIAL ID的数据库模式设计,但是现在我正在使用主键/ ID使用BYTEA类型的数据库模式。对于数据库而言,这是一种更为沉重的方法,但是它使许多高级操作变得更加容易,因为数据库中的ID与区块链上使用的全局唯一加密ID相同(有点-我将32字节截断为16B,因为我认为它足够独特)。反正...

我正在寻找优化性能的方法。尤其是INSERT操作。

首先:bytea是固定大小字节数组的最佳类型吗?

第二:INSERT的多个值是否比这更好的语法:

INSERT INTO block_tx(block_hash_id, tx_hash_id)VALUES(\'\\x5a88c1899a84b8292d35c735f5683dcd\'::bytea,\'\\x5b8428f57026e69b1d51aaafdf8cf669\'::bytea),(\'\\x5a88c1899a84b8292d35c735f5683dcd\'::bytea,\'\\xacfcbab38dc315adb698653d3429f449\'::bytea),(\'\\x4357082b70a8371437b6806cdf6202ce\'::bytea,\'\\x65e1bd91f04ff6fd92df70b6ab2ee455\'::bytea),(\'\\x4357082b70a8371437b6806cdf6202ce\'::bytea,\'\\x2970c8f15ac24141cd070c2b3155f257\'::bytea),(\'\\x4357082b70a8371437b6806cdf6202ce\'::bytea,\'\\x7a71cbdf9f1d9e7c2a4ad6aff7b82345\'::bytea),

如您所见,此后缀::bytea不断重复出现。我使用多值插入,并且将大量插入批量处理到大量交易中。众所周知,它可以提高性能,并且在我以前的设计中效果很好,因为我以前并没有到处使用BYTEA

第三:由于我使用BYTEA(有时是它们的倍数)作为键/索引-插入时,索引现在似乎需要更新得多。我能做些什么?

欢迎其他任何想法。我对INSERT的大量数据的一般优化进行了大量研究,这是我不熟悉的BYTEA类型方面。

1 个答案:

答案 0 :(得分:0)

您有几行?桌子多大?你有多少内存?

我猜该表要大得多,无法容纳在RAM中。 PRIMARY KEY的随机性导致每个INSERT都降落在表格的“随机”位置-通常不会被缓存。随着桌子越来越大,问题会越来越严重。

最终,缓存将无用,并且每个INSERT都将需要磁盘命中。也就是说,您的处理将降低磁盘速度。

该怎么办?获得比表大小更多的RAM。获取更快的磁盘。

(与此同时,缩小到16个字节而不是32个字节可能不值得。)

通过收集很多行,对其进行排序,然后然后大批量插入它们,可以得到轻微的改进。这使您稍微更好地利用缓存。