Postgresql

SELECT + INSERT 或單獨 INSERT

  • January 21, 2016

我有一個應用程序,其中幾個設備每秒向我的伺服器發送數據。在數據庫上,我有一個包含設備的表和另一個包含每秒發送數據的表。

設備第一次發送數據時,伺服器腳本應INSERT在設備表中註冊 () 該設備 id 並將數據添加到數據表中。

我的問題是,什麼會更快?

  1. 進行SELECT EXISTS查詢以確定INSERT設備表上是否需要一個。如果SELECT EXISTS返回 false 則執行一個INSERT,否則什麼也不做。
  2. 總是執行一個INSERT語句。考慮到設備 id 是表上的主鍵,如果設備已經存在,它將返回錯誤,否則將插入它。

只有設備第一次發送數據時才需要實際的INSERT,之後就不再INSERT需要了。

PostgreSQL 版本是 9.4。

設備表定義如下:

CREATE TABLE common.tag
(
 customer integer,
 hostname character varying(150),
 description text,
 model integer,
 configprofile integer,
 id character varying(150) NOT NULL,
 host integer,
 CONSTRAINT tag_pk PRIMARY KEY (id),
 CONSTRAINT tag_fk_client FOREIGN KEY (customer)
     REFERENCES common.customer (id) MATCH SIMPLE
     ON UPDATE NO ACTION ON DELETE NO ACTION,
 CONSTRAINT tag_fk_configprofile FOREIGN KEY (configprofile)
     REFERENCES common.configprofile (id) MATCH SIMPLE
     ON UPDATE NO ACTION ON DELETE NO ACTION,
 CONSTRAINT tag_fk_tagmodel FOREIGN KEY (model)
     REFERENCES common.tagmodel (id) MATCH SIMPLE
     ON UPDATE NO ACTION ON DELETE NO ACTION
)

在 Postgres 9.5中,最優雅、簡單、安全和快速的解決方案是新的UPSERT 實現

INSERT INTO device (device_id) VALUES (1234567)
ON CONFLICT (device_id) DO NOTHING;

-- now we have either inserted the device or it was there already
INSERT INTO data (device_id, data)
VALUES (1234567, 'some data);

顯然, 上必須有某種唯一索引或排除約束(device_id)

手冊中的詳細資訊。

對於舊版本或自動生成的序列號:

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