回答編集履歴

6

推敲

2020/01/15 06:57

投稿

sazi
sazi

スコア25199

test CHANGED
@@ -86,6 +86,6 @@
86
86
 
87
87
  ;
88
88
 
89
- create index test_index on test2(id, last_update_time);
89
+ create index test_index on test2(id, name, last_update_time);
90
90
 
91
91
  ```

5

修正

2020/01/15 06:57

投稿

sazi
sazi

スコア25199

test CHANGED
@@ -74,7 +74,7 @@
74
74
 
75
75
  create temp table test2(id int, name text, last_update_time timestamp) on commit drop;
76
76
 
77
- insert into test values
77
+ insert into test2 values
78
78
 
79
79
  (1, 'ぶどう', '2019/01/01 01:01:01')
80
80
 

4

追記

2020/01/15 06:55

投稿

sazi
sazi

スコア25199

test CHANGED
@@ -63,3 +63,29 @@
63
63
  ;
64
64
 
65
65
  ```
66
+
67
+
68
+
69
+ 高速にするポイントは、更新対象データをテーブルデータにする事です。
70
+
71
+ 一時テーブルを利用すれば排他も気にする必要はありません。
72
+
73
+ ```SQL
74
+
75
+ create temp table test2(id int, name text, last_update_time timestamp) on commit drop;
76
+
77
+ insert into test values
78
+
79
+ (1, 'ぶどう', '2019/01/01 01:01:01')
80
+
81
+ ,(2, 'バナナ', '2019/01/31 10:01:01')
82
+
83
+ ,(3, 'ミカン', '2019/01/31 10:01:01')
84
+
85
+ ,(4, 'なし' , '2019/01/31 10:01:01')
86
+
87
+ ;
88
+
89
+ create index test_index on test2(id, last_update_time);
90
+
91
+ ```

3

追記

2020/01/15 06:54

投稿

sazi
sazi

スコア25199

test CHANGED
@@ -39,3 +39,27 @@
39
39
 
40
40
 
41
41
  ですが、レスポンスを考えるなら、updateとinsertをそれぞれで行った方が高速です。
42
+
43
+ ```SQL
44
+
45
+ UPDATE test tgt SET
46
+
47
+ name=val.name
48
+
49
+ , last_update_time=val.last_update_time
50
+
51
+ FROM test2 val
52
+
53
+ WHERE tgt.id=val.id
54
+
55
+ and (tgt.name!=val.name or tgt.last_update_time!=val.last_update_time)
56
+
57
+ ;
58
+
59
+ INSERT INTO test tgt SELECT * FROM test2 src
60
+
61
+ WHERE not exists(select 1 from test where id=src.id)
62
+
63
+ ;
64
+
65
+ ```

2

追記

2020/01/15 06:50

投稿

sazi
sazi

スコア25199

test CHANGED
@@ -28,7 +28,11 @@
28
28
 
29
29
  )
30
30
 
31
+ INSERT INTO test tgt SELECT * FROM test2 src
32
+
31
- INSERT INTO test SELECT * FROM test2 WHERE id NOT IN (SELECT id FROM upd)
33
+ WHERE id NOT IN (SELECT id FROM upd)
34
+
35
+ and not exists(select 1 from test where id=src.id)
32
36
 
33
37
  ```
34
38
 

1

推敲

2020/01/15 06:47

投稿

sazi
sazi

スコア25199

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- with式とreturninを活用すれば可能です。
5
+ with式と[returning](https://www.postgresql.jp/document/11/html/dml-returning.html)を活用すれば可能です。
6
6
 
7
7
 
8
8