Postgresql

如何在 VALUES 和 SELECT 之間進行選擇以進行 INSERT?

  • February 11, 2016

這個答案向我提出瞭如何在這樣的功能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. 我對並發程序和實時數據分析的要求感興趣。

您如何在SELECTVALUESfor之間做出決定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(沒有引號,只有數字)這樣的數字常量預設自動輸入整數。

可能不適用,具體取決於您的工作流程。

有關的:

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