2017-10-11 85 views
1

我想提高一个包含1000万以上记录的大型表格中数字列的精度。标准方式是ALTER TABLE mytable ALTER COLUMN mycolumn TYPE numeric(15,6)将锁定表。这是一个高度交易的表格。有没有办法做到这一点,而不锁定表,不重新创建表,复制数据,重命名/交换表?我目前正在运行一个dockerized postgres 9.5在不锁定表格的情况下提高数字数据类型的精度

+0

什么是原始列定义?当您不更改_precision_时,表格将不会被**重写,例如从'(12,6)'到'(15,6)'不会发生重写。 –

回答

0

我没有想到改变typmod需要一个完整的表重写,但一个快速检查表明,如果你在finish_heap_swap设置断点,它实际上是做一个重写cmd像ALTER TABLE test_numeric ALTER COLUMN x TYPE numeric(8,4) - 至少在9.5。


编辑a_horse_with_no_name指出,如果你改变了精度,而不是规模重写时,才会执行。所以你可以用短暂的独占锁来做到这一点,它不会大大干扰操作。


否则:

你可能欺骗和直接更新系统目录,因为你知道新精密的有效期为与老精度都行。但是我有点犹豫,因为如果这很简单,PostgreSQL可能已经做到了。我不能推荐它,但如果你想实验,测试,做一些阅读等,你可以从那里开始。

对于表test_numericx numeric(4,2)柱:

test=> select atttypmod from pg_attribute where attrelid = 'test_numeric'::regclass AND attname = 'x'; 
atttypmod 
----------- 
    262150 
(1 row) 

如果我ALTER15,6

test=> select atttypmod from pg_attribute where attrelid = 'test_numeric'::regclass AND attname = 'x'; 
atttypmod 
----------- 
    983050 
(1 row) 

(我不能打扰阅读的代码上的typmod怎么看32位的typmod字段被分解为精度和尺度,但你可以如果你想要。)

安全UPDATEpg_attribute条目与新的atttypmod。但正如我所说的,先做一些阅读和研究,看看你能否找到关于直接typmod更新的先前讨论。适用于延长VARCHAR(n)

任何也将适用于NUMERIC,因为两者都是内部VARLENA存储类型,并且都typmods其中较大的值较小值的纯超集。你可能会发现更多关于延长VARCHAR而不重写的信息。

+1

似乎重写只发生在改变精度的情况下。例如当从(8,2)'到(10,2)'时,表是**不被重写。但是从(8,2)到(10,4)'它会被重写。 –

+0

@a_horse_with_no_name好的! –

+0

@a_horse_with_no_name非常感谢!我已经在我的测试中证实了这一点。虽然我认为文档可能需要更清楚一点。这不是我读过的。好吧。 –

相关问题