我正在尝试使用表B中的两个数据值(每天备份每天的日期)来更新表A,B有数百万级别的数据 表A和B的结构是
A -----Da primary key
-----Db
B -----Da (table may have many Da data)
-----Db
-----....
现在,我的SQL是:
INSERT INTO A (Da,Db)
SELECT DISTINCT on(Da)Da,Db
FROM B
ON conflict(Da) DO UPDATE SET Db = excluded.Db
但效率低下,我认为如果做出判断(如果A.Db = B.Db则不做任何事情),UPDATE之前会提高效率,因为A.Db = B.Db在大多数情况下(约百分之九十八) 。 如何编写代码对我来说是个问题(我对SQL不太熟悉) 乞求你一个伟大的上帝,令人讨厌! !
答案 0 :(得分:0)
B(Da, Db)
上的索引应该可以解决任何性能问题。
但是,您的查询不正确。使用DISTINCT ON
时,您需要ORDER BY
:
INSERT INTO A (Da,Db)
SELECT DISTINCT ON (Da) Da, Db
FROM B
ORDER BY Da, Db
ON CONFLICT (Da) DO UPDATE SET Db = excluded.Db;