带有TimescaleDB的PostgreSQL在索引创建期间仅使用单个核心
我们有一个有几十亿行的PostgreSQL超级表,我们正试图在其上创建一个唯一的索引,如下所示:带有TimescaleDB的PostgreSQL在索引创建期间仅使用单个核心,sql,postgresql,ubuntu,timescaledb,Sql,Postgresql,Ubuntu,Timescaledb,我们有一个有几十亿行的PostgreSQL超级表,我们正试图在其上创建一个唯一的索引,如下所示: 在public.device_数据上创建唯一索引device_数据__deviceid__value_type__时间戳__idx(device_id,value_type,“timestamp”DESC) 我们创建的超表格如下所示: 选择create_hypertable('device_data','timestamp') 由于我们希望尽可能快地创建索引,因此我们希望并行化索引创建,并遵循以下步
在public.device_数据上创建唯一索引device_数据__deviceid__value_type__时间戳__idx(device_id,value_type,“timestamp”DESC)代码>
我们创建的超表格如下所示:
选择create_hypertable('device_data','timestamp')代码>
由于我们希望尽可能快地创建索引,因此我们希望并行化索引创建,并遵循以下步骤
我们测试了work\u mem
,maintenance\u work\u mem
,max\u worker\u进程
,max\u parallel\u maintenance\u workers
和max\u parallel\u workers
的各种设置。我们还在表上设置parallel_workers
设置:ALTER table device_数据集(parallel_workers=10)代码>。但无论我们做什么,索引创建总是只使用一个核心(我们有16个可用),因此创建需要很长时间
你知道我们可能会错过什么吗
我们的PostgreSQL版本是12.5,服务器运行Ubuntu 18。不幸的是,Timescale目前不支持并行索引创建。我建议提交一个Github问题,请求支持它。这是一个有点沉重的任务,可能不会很快得到优先考虑。我认为另一个可能有用的选项是在这里使用transaction\u per\u chunk
选项,允许用户控制索引的创建方式,因此一个简单的api可以为所有将来的块创建索引,但不能在旧块上创建索引,然后允许您调用create\u index(chunk\u name,ht\u index\u name)
在所有块上,然后您可以在自己的代码中并行化该操作。这最终是一个简单得多的提升,因为并行索引创建的事务性是最难的部分。第二个选项是否也适用于唯一索引?我们正在使用建立非唯一索引。。。使用(timescaledb.transaction\u/块)代码>,但据我所知,此选项不能与唯一索引一起使用。也可以在这里看到(也许是你写了这篇评论?)。你知道有没有计划支持transaction\u per\u chunk
的唯一索引?嗯……这可能有点困难,但我可以想象,你可以构建唯一索引,然后在构建块上的所有索引后进行操作,以使其成为超表上的索引。我会在你提交的问题中包括这一点,甚至可能为此单独打开一个问题。