我正在研究一种将区块链数据转储到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
类型方面。
答案 0 :(得分:0)
您有几行?桌子多大?你有多少内存?
我猜该表要大得多,无法容纳在RAM中。 PRIMARY KEY
的随机性导致每个INSERT
都降落在表格的“随机”位置-通常不会被缓存。随着桌子越来越大,问题会越来越严重。
最终,缓存将无用,并且每个INSERT
都将需要磁盘命中。也就是说,您的处理将降低磁盘速度。
该怎么办?获得比表大小更多的RAM。获取更快的磁盘。
(与此同时,缩小到16个字节而不是32个字节可能不值得。)
通过收集很多行,对其进行排序,然后然后大批量插入它们,可以得到轻微的改进。这使您稍微更好地利用缓存。