teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

追記

2019/03/07 01:55

投稿

ynaK235
ynaK235

スコア14

title CHANGED
File without changes
body CHANGED
@@ -5,8 +5,8 @@
5
5
  ```
6
6
  SELECT *
7
7
  FROM (((Atbl LEFT JOIN MHtbl ON Atbl.keyA = MHtbl.MHkey)
8
- LEFT JOIN MRtbl as MRtbl(id2, MRkey, datal_2, data2_2) ON Atbl.keyA = MRtbl.MRkey)
8
+ LEFT JOIN MRtbl as MRtbl(id2, MRkey, datal_2, data2_2) ON Atbl.keyB = MRtbl.MRkey)
9
- LEFT JOIN gtbl ON Atbl.keyA = gtabl.gkey)
9
+ LEFT JOIN gtbl ON Atbl.keyA = gtbl.gkey)
10
10
  LEFT JOIN ttbl ON Atbl.keyA = ttbl.tkey
11
11
  WHERE (Aname_1 LIKE 'saito%' OR Aname_2 LIKE 'saito%' OR gname LIKE 'saito%' OR tname LIKE 'saito%')
12
12
  ORDER BY TO_NUMBER(Sort, '999999')
@@ -27,4 +27,88 @@
27
27
  ttbl:4万レコード ほどあり、
28
28
  結合テーブルの総数は1億レコードほどになります…
29
29
 
30
- どうかよろしくお願いします。
30
+ どうかよろしくお願いします。
31
+
32
+
33
+ ### 修正
34
+ 申し訳ありません。
35
+ 上記SQL3行目の
36
+ ```
37
+ LEFT JOIN MRtbl as ~~ ON Atbl.keyA = MRtbl.MRkey)
38
+ ```
39
+ Atbl.keyAですが、Atbl.keyBの間違いでした。
40
+
41
+ gtabl.gkeyはgtbl.gkeyの間違いです。
42
+
43
+
44
+ ### 追記情報
45
+ 結合条件のデータ型は、
46
+ Atbl.keyA :text型
47
+ Atbl.keyB :character(100)
48
+ MHtbl.MHkey:character varying(100)
49
+ MRtbl.MRkey:character varying(30)
50
+ gtbl.gkey :text型
51
+ ttbl.tkey :text型
52
+ となります。
53
+ 氏名フィールドは全てcharacter(100)です。
54
+
55
+ ### INDEX
56
+ 以下、現在張っているINDEXです。
57
+ aidはユニークキーです。
58
+ ```
59
+ ・Atbl
60
+ CREATE UNIQUE INDEX Atbl_index1 ON Atbl(aid);
61
+ CREATE INDEX Atbl_index2 ON Atbl(keyA);
62
+ CREATE INDEX Atbl_index3 ON Atbl(keyB);
63
+ CREATE UNIQUE INDEX Atbl_index4 ON Atbl(Sort);
64
+ CREATE INDEX Atbl_index5 ON Atbl(Aname_1);
65
+ CREATE INDEX Atbl_index6 ON Atbl(Aname_2);
66
+
67
+ ・MHtbl
68
+ CREATE INDEX MHtbl_index1 ON MHtbl(MHkey);
69
+
70
+ ・MRtbl
71
+ CREATE INDEX MRtbl_index1 ON MRtbl(MRkey);
72
+
73
+ ・gtbl
74
+ CREATE INDEX gtbl_index1 ON gtbl(gkey);
75
+ CREATE INDEX gtbl_index2 ON gtbl(gname);
76
+ CREATE INDEX gtbl_index3 ON gtbl(gkey,gname);
77
+
78
+ ・ttbl
79
+ CREATE INDEX ttbl_index1 ON ttbl(tkey);
80
+ CREATE INDEX ttbl_index2 ON ttbl(tname);
81
+ CREATE INDEX ttbl_index3 ON ttbl(tkey,tname);
82
+ ```
83
+
84
+ ### 実行計画
85
+ 以下、上記SQLの実行計画です。
86
+ 上記では特に書いていませんが、条件で絞る際に氏名フィールドをtrimして調べています。
87
+ ```
88
+ Sort (cost=849229.02..849282.91 rows=21558 width=6000) (actual time=239590.374..239590.384 rows=121 loops=1)"
89
+ Sort Key: (to_number((Atbl.Sort)::text, '999999'::text))"
90
+ Sort Method: quicksort Memory: 497kB"
91
+ -> Hash Left Join (cost=31280.86..681220.78 rows=21558 width=6000) (actual time=238839.000..239589.440 rows=121 loops=1)"
92
+ Hash Cond: (Atbl.keyB = (MRtbl.MRkey)::bpchar)"
93
+ -> Merge Left Join (cost=0.00..602188.71 rows=21558 width=5092) (actual time=199890.723..206467.397 rows=121 loops=1)"
94
+ Merge Cond: (Atbl.keyA = (MHtbl.MHkey)::text)"
95
+ -> Merge Left Join (cost=0.00..591727.41 rows=21558 width=3037) (actual time=199886.538..206456.358 rows=121 loops=1)"
96
+ Merge Cond: (Atbl.keyA = ttbl.tkey)"
97
+ Filter: ((btrim((Atbl.tname)::text) ~~ 'saito%'::text) OR (btrim((Atbl.tsyoyuname)::text) ~~ 'saito%'::text) OR (btrim((ttbl.tname)::text) ~~ 'saito%'::text) OR (btrim((gtbl.gname)::text) ~~ 'saito%'::text))"
98
+ -> Merge Left Join (cost=0.00..536115.96 rows=452180 width=2443) (actual time=0.349..1138.254 rows=688962 loops=1)"
99
+ Merge Cond: (Atbl.keyA = gtbl.gkey)"
100
+ -> Index Scan using Atbl_index2 on Atbl (cost=0.00..524833.13 rows=208214 width=1849) (actual time=0.299..653.764 rows=208214 loops=1)"
101
+ -> Materialize (cost=0.00..4056.78 rows=30870 width=594) (actual time=0.046..93.040 rows=495976 loops=1)"
102
+ -> Index Scan using gtbl_index1 on gtbl (cost=0.00..3979.60 rows=30870 width=594) (actual time=0.043..43.229 rows=30870 loops=1)"
103
+ -> Materialize (cost=0.00..5719.51 rows=43746 width=594) (actual time=0.041..2557.181 rows=60456515 loops=1)"
104
+ -> Index Scan using ttbl_index1 on ttbl (cost=0.00..5610.14 rows=43746 width=594) (actual time=0.039..51.374 rows=43746 loops=1)"
105
+ -> Materialize (cost=0.00..10337.11 rows=4085 width=2055) (actual time=0.040..9.145 rows=4085 loops=1)"
106
+ -> Index Scan using MHtbl_index1 on MHtbl (cost=0.00..10326.90 rows=4085 width=2055) (actual time=0.036..8.630 rows=4085 loops=1)"
107
+ -> Hash (cost=8650.27..8650.27 rows=178527 width=908) (actual time=32294.156..32294.156 rows=178527 loops=1)"
108
+ Buckets: 1024 Batches: 256 Memory Usage: 223kB"
109
+ -> Seq Scan on MRtbl (cost=0.00..8650.27 rows=178527 width=908) (actual time=0.023..134.435 rows=178527 loops=1)"
110
+ Total runtime: 239590.967 ms"
111
+ ```
112
+ ```
113
+ WHERE (trim(Aname_1) LIKE 'saito%' OR trim(Aname_2) LIKE 'saito%' OR trim(gname) LIKE 'saito%' OR trim(tname) LIKE 'saito%')
114
+ ```

1

誤字

2019/03/07 01:55

投稿

ynaK235
ynaK235

スコア14

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  ### SQLの高速化
2
- PostgreSQLにて以下のような多重joinを行テーブルにおいて、検索スピードが遅く困っております。このままのテーブル構造でどうにか早くしたいです。
2
+ PostgreSQLにて以下のような多重joinを行い、複数のテーブルにまたがるORにおいて、検索スピードが遅く困っております。このままのテーブル構造でどうにか早くしたいです。
3
3
 
4
4
 
5
5
  ```