Postgresql
如何在 VALUES 和 SELECT 之間進行選擇以進行 INSERT?
這個答案向我提出瞭如何在這樣的功能
VALUES
之間進行選擇的問題。在 x86_64-unknown-linux-gnu 上使用PostgreSQL 9.4.3,由 gcc (Debian 4.9.2-10) 4.9.2, 64-bit 編譯:SELECT
CREATE OR REPLACE FUNCTION insaft_function() RETURNS TRIGGER AS $func$ BEGIN INSERT INTO file_headers (measurement_id, file_header_index_start , file_header_index_end) VALUES (NEW.measurement_id, TG_ARGV[0]::int, TG_ARGV[1]::int); RETURN NULL; -- result ignored since this is an AFTER trigger END $func$ LANGUAGE plpgsql;
VALUES
與許多行一起工作,但SELECT
你可以做更多。這裡唯一的要求是對INSERT
錶執行上述操作。您可以假設INSERT
在系統的連續質量保證中每個週期完成了 100k 次此類操作。我注意到這些差異與我的數據在這裡選擇了三個中值:
VALUES real user sys ------------------------------- 0m0.353s 0m0.256s 0m0.028s 0m0.327s 0m0.252s 0m0.036s 0m0.358s 0m0.252s 0m0.040s so average real 0.34s SELECT real user sys ------------------------------- 0m0.362s 0m0.256s 0m0.024s 0m0.383s 0m0.236s 0m0.056s 0m0.356s 0m0.264s 0m0.032s so average real 0.36s
因此,這個小數據子集表明
VALUES
使用如此簡單的INSERT
. 我對並發程序和實時數據分析的要求感興趣。您如何在
SELECT
和VALUES
for之間做出決定INSERT
?
測量的差異幾乎肯定是噪音。執行更多的迭代,你不會得到一致的結果。性能差異(如果存在)將無法衡量。
您可以在此處使用任何一種方法。兩者都同樣適用於目的。SQL 中通常有多種方式。有時沒有明確的贏家。
這里關於性能的更重要問題:
每個週期完成 100k 次這樣的 INSERT
INSERT
對於大批量插入,在兩個表中都更快,而不是為每一行觸發觸發器。如果您使用的是自動生成的串列 PK,則可以
RETURNING
在數據修改 CTE 中使用該子句WITH ins1 AS ( INSERT INTO measurement (measurement) VALUES ... -- OR SELECT ... if data comes from inside the DB :) RETURNING measurement_id -- generating a serial ID? ) INSERT INTO file_headers (measurement_id, file_header_index_start, file_header_index_end) SELECT measurement_id, 1, 666 -- here it *must* be SELECT FROM ins1;
像
666
(沒有引號,只有數字)這樣的數字常量預設自動輸入整數。可能不適用,具體取決於您的工作流程。
有關的: