【发布时间】:2015-09-28 19:33:00
【问题描述】:
我在数据库中有一个字符串列需要转换为数组类型。在我还需要设置索引的过程中,不应该锁定数据库。
ALTER TABLE sites ALTER COLUMN rtb_id TYPE varchar[] USING string_to_array(rtb_id, '');
CREATE INDEX CONCURRENTLY rtb_id_search ON sites(rtb_id) USING array_to_string;
DROP INDEX CONCURRENTLY ix_sites_bundle_trgm_gin ON sites;
DROP INDEX CONCURRENTLY ix_sites_name_trgm_gin ON sites;
这是这样做的吗?
编辑:
ALTER TABLE sites ADD COLUMN rtb_ids varchar[]
...
BEFORE INSERT OR UPDATE ... FOR EACH ROW trigger that sets NEW.rtb_id_new := string_to_array(NEW.rtb_id,' ') for each row.
In batches, UPDATE sites SET rtb_id_new = string_to_array(rtb_id,' ')
...
VACUUM sites;
CREATE INDEX CONCURRENTLY rtb_ids_search ON sites(rtb_ids) USING array_to_string(rtb_ids, '');
ALTER TABLE sites DROP COLUMN rtb_id;
谢谢
【问题讨论】:
-
很难说。请提供基本信息:表和索引定义、
rtb_id的示例值,并描述您的用例和基本原理。 非常奇怪的是,ID 列将是一个数组。数组列上的默认 btree 索引似乎没有多大意义......
标签: arrays postgresql indexing locking