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

回答編集履歴

7

追記

2019/01/07 09:54

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -32,4 +32,43 @@
32
32
  AND tpl.user_id <> ' ')
33
33
  ```
34
34
  ここは先ず、`t_message_mng`にpost_idとuser_idのインデックスが必要ですね。
35
- 先ずは両方の項目を持ったインデックスを適用して、改善されないなら、別々のインデックスにして、or結合じゃなく、left join で各々結合する。
35
+ 先ずは両方の項目を持ったインデックスを適用して、改善されないなら、別々のインデックスにして、or結合じゃなく、left join で各々結合する。
36
+
37
+ 追記
38
+ --
39
+ 以下は問題部分だけのSQLです。
40
+ 先ずはこれで検証してみましょう。
41
+ ```SQL
42
+ WITH tenant_post_detail_list AS (select ~)
43
+ SELECT
44
+ mm.*
45
+ ,tpl.tenant_post_name
46
+ FROM
47
+ .t_message_mng AS mm
48
+ INNER JOIN tenant_post_detail_list tpl
49
+ ON
50
+ (tpl.post_id = mm.post_id
51
+ AND tpl.post_id <> 'tenant'
52
+ AND tpl.user_id = ' ')
53
+ OR
54
+ (tpl.user_id = mm.user_id
55
+ AND tpl.post_id = 'tenant'
56
+ AND tpl.user_id <> ' ')
57
+ ```
58
+ 上記を計測したのち、以下の組み替えたものを実行してみてください。
59
+ ```SQL
60
+ WITH tenant_post_detail_list AS (select ~)
61
+ SELECT
62
+ mm.*
63
+ , case when tpl1.post_id <> 'tenant' AND tpl1.user_id = ' ' then tpl1.tenant_post_name
64
+ else case when tpl2.post_id = 'tenant' AND tpl2.user_id <> ' ' then tpl2.tenant_post_name
65
+ end end tenant_post_name
66
+ FROM
67
+ .t_message_mng AS mm
68
+ left JOIN tenant_post_detail_list tpl1
69
+ ON .post_id = mm.post_id or
70
+ left JOIN tenant_post_detail_list tpl2
71
+ ON tpl2.user_id = mm.user_id
72
+ ```
73
+ さらに、`t_message_mng`にpost_idとuser_idのインデックスを追加し計測してみて下さい。
74
+ 効果が無ければ、インデックスが適用されるようにSQLを見直しです。

6

修正

2019/01/07 09:54

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -32,4 +32,4 @@
32
32
  AND tpl.user_id <> ' ')
33
33
  ```
34
34
  ここは先ず、`t_message_mng`にpost_idとuser_idのインデックスが必要ですね。
35
- 別々のインデックスにして、or結合じゃなく、left join で各々結合する方が確実そうです
35
+ 先ずは両方の項目を持ったインデックスを適用して、改善されないなら、別々のインデックスにして、or結合じゃなく、left join で各々結合する。

5

推敲

2019/01/07 08:40

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -19,7 +19,7 @@
19
19
  追記
20
20
  --
21
21
  ※SQLが追加されたので。
22
- コストが掛かっているのは以下ですね。
22
+ 一番コストが掛かっているのは以下ですね。
23
23
  ```SQL
24
24
  INNER JOIN tenant_post_detail_list tpl
25
25
  ON

4

追記

2019/01/07 07:59

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -14,4 +14,22 @@
14
14
  -> Nested Loop (cost=132.68..4502.88 rows=115 width=1370) (actual time=27.183..3164.768 rows=24443 loops=1)
15
15
  -> CTE Scan on tenant_post_detail_list tpl (cost=0.00..0.42 rows=1 width=102) (actual time=12.285..256.152 rows=677 loops=1)
16
16
  ```
17
- `CTE Scan`部分は244ms掛かっていますので、可能ならチューニングですけど、それよりも、それとの突合で`Nested Loop`部分が3000msと500ms位になってますので、ここを何とかしないと改善されません。
17
+ `CTE Scan`部分は244ms掛かっていますので、可能ならチューニングですけど、それよりも、それとの突合で`Nested Loop`部分が3000msと500ms位になってますので、ここを何とかしないと改善されません。
18
+
19
+ 追記
20
+ --
21
+ ※SQLが追加されたので。
22
+ コストが掛かっているのは以下ですね。
23
+ ```SQL
24
+ INNER JOIN tenant_post_detail_list tpl
25
+ ON
26
+ (tpl.post_id = mm.post_id
27
+ AND tpl.post_id <> 'tenant'
28
+ AND tpl.user_id = ' ')
29
+ OR
30
+ (tpl.user_id = mm.user_id
31
+ AND tpl.post_id = 'tenant'
32
+ AND tpl.user_id <> ' ')
33
+ ```
34
+ ここは先ず、`t_message_mng`にpost_idとuser_idのインデックスが必要ですね。
35
+ 別々のインデックスにして、or結合じゃなく、left join で各々結合する方が確実そうです。

3

追記

2019/01/07 07:58

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -10,7 +10,8 @@
10
10
 
11
11
  チューニングが必要なのは以下の部分です。
12
12
  ```
13
+ -> Nested Loop (cost=133.11..5279.44 rows=17 width=1386) (actual time=27.226..3547.307 rows=3790 loops=1)
13
- -> Nested Loop (cost=132.68..4502.88 rows=115 width=1370) (actual time=27.183..3164.768 rows=24443 loops=1)
14
+ -> Nested Loop (cost=132.68..4502.88 rows=115 width=1370) (actual time=27.183..3164.768 rows=24443 loops=1)
14
- -> CTE Scan on tenant_post_detail_list tpl (cost=0.00..0.42 rows=1 width=102) (actual time=12.285..256.152 rows=677 loops=1)
15
+ -> CTE Scan on tenant_post_detail_list tpl (cost=0.00..0.42 rows=1 width=102) (actual time=12.285..256.152 rows=677 loops=1)
15
16
  ```
16
- `CTE Scan`部分は244ms掛かっていますので、可能ならチューニングですけど、それよりも、それとの突合で`Nested Loop`部分が3137msになってますので、ここを何とかしないと改善されません。
17
+ `CTE Scan`部分は244ms掛かっていますので、可能ならチューニングですけど、それよりも、それとの突合で`Nested Loop`部分が3000msと500ms位になってますので、ここを何とかしないと改善されません。

2

修正

2019/01/07 07:50

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -13,4 +13,4 @@
13
13
  -> Nested Loop (cost=132.68..4502.88 rows=115 width=1370) (actual time=27.183..3164.768 rows=24443 loops=1)
14
14
  -> CTE Scan on tenant_post_detail_list tpl (cost=0.00..0.42 rows=1 width=102) (actual time=12.285..256.152 rows=677 loops=1)
15
15
  ```
16
- `CTE Scan`部分は256ms掛かっていますので、可能ならチューニングですけど、それよりも、それとの突合で`Nested Loop`部分が3164msになってますので、ここを何とかしないと改善されません。
16
+ `CTE Scan`部分は244ms掛かっていますので、可能ならチューニングですけど、それよりも、それとの突合で`Nested Loop`部分が3137msになってますので、ここを何とかしないと改善されません。

1

推敲

2019/01/07 07:47

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  チューニングが必要なのは以下の部分です。
12
12
  ```
13
- -> Nested Loop (cost=132.68..4502.88 rows=115 width=1370) (actual time=27.183..3164.768 rows=24443 loops=1)
13
+ -> Nested Loop (cost=132.68..4502.88 rows=115 width=1370) (actual time=27.183..3164.768 rows=24443 loops=1)
14
- -> CTE Scan on tenant_post_detail_list tpl (cost=0.00..0.42 rows=1 width=102) (actual time=12.285..256.152 rows=677 loops=1)
14
+ -> CTE Scan on tenant_post_detail_list tpl (cost=0.00..0.42 rows=1 width=102) (actual time=12.285..256.152 rows=677 loops=1)
15
15
  ```
16
16
  `CTE Scan`部分は256ms掛かっていますので、可能ならチューニングですけど、それよりも、それとの突合で`Nested Loop`部分が3164msになってますので、ここを何とかしないと改善されません。