我通过稍微改变我的数据结构解决了这个问题。
ALTER TABLE my_table RENAME to my_table_old;
然后我创建了一个与原始表同名的视图
CREATE OR REPLACE VIEW my_table AS
select * from my_table_old;
当我得到我的新数据集时,我会创建一个新表(在名称末尾附加序列)
EXECUTE 'CREATE TABLE my_table_'||nextval('seq_table_id')|| ' AS SELECT * FROM my_table_old WHERE 1=2;'
创建所有索引并分析它
EXECUTE 'CREATE INDEX idx_column1_'||currval('seq_table_id')|| ' ON my_table_'||
currval('seq_table_id')||' USING btree(column1);'||
EXECUTE 'CREATE INDEX idx_column2_'||currval('seq_table_id')||
' ON my_table_'||currval('seq_table_id')||' USING btree(column2);'
虽然所有这些都完成了,但我的 web 应用程序继续映射到旧表,完全不受影响。
最后我分析一下表格
EXECUTE 'ANALYZE my_table_'||currval('seq_table_id');
一旦我对一切都感到满意,我会“做旧的切换器”,并将我的视线指向新的桌子
EXECUTE 'CREATE OR REPLACE VIEW my_table AS SELECT * FROM my_table_'||(SELECT last_value FROM seq_table_id)||';';
一切都立即切换,已经被索引,而 Hibernate 再聪明不过了!