Postgresql

在 Postgres 中用連續索引填充一列

  • July 19, 2022

想像一下下面的表格:

tmp_migration.asset

╔══════════╦══════════════════════════╗
║ id       ║ ...many other columns... ║
╠══════════╬══════════════════════════╣
║       15 ║                      ... ║
║       16 ║                      ... ║
║       17 ║                      ... ║
║       18 ║                      ... ║
║    10020 ║                      ... ║
║    10021 ║                      ... ║
╚══════════╩══════════════════════════╝

你看,索引不是從 1 開始,有間隙等等。

問題

我想添加一個tempId具有連續索引的新列。該表有 80m 行。我怎樣才能做到這一點?我用Google搜尋了很多東西,結果一無所獲。

背景

該表是數據遷移項目的一部分。tmp_migration是作為數據遷移源創建的臨時模式。在目前步驟中,我嘗試在進行數據轉換時從tmp_migration.assetto複製。public.asset我正在為此使用組合INSERT INTO ... SELECT ...查詢。

問題是,它需要幾個小時(80m 行),並且在執行期間我沒有收到任何進度通知。為了解決這個問題,我想使用“分頁”。在使用插入/選擇腳本呼叫的 bash 中psql,我創建了一個循環來設置傳遞給腳本的邊界。

我開始通過添加使用限制/偏移

LIMIT :limit
OFFSET :offset;

到腳本,但是在更高的“頁面”之後,這會大大減慢。因此,建議WHERE在您的 PK 上使用超出限制/偏移量。但是,為此我需要一個連續的 PK,而我沒有。因此,我想到了添加一個臨時一致索引。

也許還有其他我現在看不到的解決方案。會很高興得到幫助。

展示:

CREATE TABLE test (id INT PRIMARY KEY, other_field INT);
INSERT INTO test VALUES (3,333),(55,555),(777,777);
SELECT * FROM test;
ALTER TABLE test ADD COLUMN continuous INT;
SELECT * FROM test;
UPDATE test
SET continuous = calculate_rownumber.rownumber
FROM ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) rownumber
       FROM test ) calculate_rownumber
WHERE test.id = calculate_rownumber.id;
SELECT * FROM test;

db<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/314575