向表中添加新的 BIGSERIAL 列時,可以指定生成值的順序嗎?
我需要在
BIGSERIAL
一個巨大的表(約 30 億條記錄)中添加一個新列。這個問題與我需要做的類似,並且接受的答案對我有所幫助。但我仍然想知道一些事情。就我而言,該表已經有一個BIGSERIAL
作為主鍵的列,但是許多行已被刪除,所以現在有gaps。(該表隨後被完全清空。)我需要重新生成這些值,以便它們再次是連續的。以下是我想要實現的 5 個範例行new_value > 1000
:+---------+---------+ |old_value|new_value| +---------+---------+ |1026 |1001 | |1027 |1002 | |1030 |1003 | |1032 |1004 | |1039 |1005 | +---------+---------+
CREATE TABLE ...
我已經成功地實施了上面引用的答案(然後)中提到的替代方法INSERT INTO new_table SELECT * FROM ...
,但我也想嘗試並以最初的建議為基準。然而,問題是我不知道是否new_value
會以**與 the 相同的順序生成,**因為old_value
這是一個要求。當使用如下語句添加列時,如何確保
new_value
列的順序遵循/跟踪列的順序:old_value``new_value
ALTER TABLE existing_table ADD COLUMN new_value BIGSERIAL;
不同的方法
我還嘗試了以下操作(在小桌子上效果很好),但它比在非常大的桌子上引用答案的替代建議要慢得多:
ALTER TABLE existing_table ADD COLUMN new_value BIGINT NOT NULL DEFAULT 0; UPDATE existing_table AS existing SET new_value = generated.new_id FROM ( SELECT original.old_value , row_number() OVER (ORDER BY original.old_value) AS new_id FROM existing_table AS original ) generated WHERE existing.old_value = generated.old_value;
首先,考慮評論中的建議:你真的需要消除差距嗎?通常,您不會。並且差距將重新出現。請參閱:
接下來,考慮對我一直在努力的舊答案的更新:
除其他外,如何避免為新表中的表數據寫入 WAL - 這將是進一步提高性能的最重要的位。
當使用如下語句添加列時,如何確保
new_value
列的順序遵循/跟踪列的順序:old_value``new_value
ALTER TABLE existing_table ADD COLUMN new_value BIGSERIAL;
你不能。使用其他路線之一。
我還嘗試了以下操作(在小桌子上效果很好),但它比在非常大的桌子上引用答案的替代建議要慢得多:
該
UPDATE
路線本質上比從頭開始編寫原始新表(之後添加索引約束)更昂貴。