我有一个巨大的数据集,每天都会更改,并绑定到Java对象。我的应用程序在DAO层使用Hibernate。
当我更改数据时,我需要重建索引,但如果我在使用时使用实时表执行此操作,则数据库将停止运行。
如果我有一个临时表来将所有新数据上传到这里并在此创建新索引,那么我可以删除实时表并重命名我的临时表而不会注意休眠吗?
答案 0 :(得分:2)
我通过稍微改变我的数据结构来解决这个问题。
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);'
虽然所有这些都已完成,但我的webapp仍然会映射到旧表,完全不受影响。
最后我分析了表格
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则不是更明智的!
答案 1 :(得分:0)
不,您将不得不进行一些“计划停机”,关闭应用程序,删除并重命名表格,然后重新启动应用程序。
由于删除“实时”表可能需要一些时间,因此您可能希望通过重命名两个表,然后重新启动应用程序来最小化停机时间。然后你可以悠闲地放下旧桌子。