回答編集履歴

3

推敲

2018/11/14 12:36

投稿

sazi
sazi

スコア25206

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- 結果的にサブクエリーをさらに集計するような仕組みが働いているので、遅いのではないかと思われます。
27
+ 結果的にサブクエリーをさらに集計するような仕組みが働いて、遅いのではないかと思われます。
28
28
 
29
29
  基本に忠実に、SQLを組み立てると、必要なインデックスも明確になると思います。
30
30
 

2

推敲

2018/11/14 12:36

投稿

sazi
sazi

スコア25206

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
 
32
32
 
33
- 性能が改善するかどうかわかりませんが、素直に組み立てると以下のようなSQLになるのではないかと。
33
+ 性能が改善するかどうかわかりませんが、素直にキーを揃えるように組み立てると以下のようなSQLになるのではないかと。
34
34
 
35
35
  ```SQL
36
36
 

1

追記

2018/11/14 12:34

投稿

sazi
sazi

スコア25206

test CHANGED
@@ -2,9 +2,29 @@
2
2
 
3
3
  ※他のDBMSなら文法エラー
4
4
 
5
+ 説明します。
6
+
7
+ 先ず集計前の状態の以下のSQLは正しい結果だと思います。
8
+
9
+ ```SQL
10
+
11
+ SELECT location_id, product_id, stock_num
12
+
13
+ , IFNULL((SELECT SUM(bst.bought_num) FROM BoughtStock bst WHERE bst.stock_id = stk.stock_id), 0) AS '引当総数'
14
+
15
+ , (SELECT SUM(stk2.stock_num) FROM Stock stk2 WHERE stk2.location_id = stk.location_id) AS 'ロケ内総在庫数'
16
+
17
+ FROM Stock
18
+
19
+ ```
20
+
21
+ これを、`location_id`, `product_id`単位で集計としていますが、じゃあ、`引当総数`と`ロケ内総在庫数`はどんな集計されているの?って事です。これらは集計されず適当な何れかの値が採用されています。
22
+
23
+ 相関問い合わせなので、それらの相関内の何れかの値が使用されていますが、何れも同じ値なので、求めたいものと同じになっているに過ぎません。
5
24
 
6
25
 
26
+
7
- サブクエリーをさらに集計するような仕組みが働いているので、遅いのではないかと思われます。
27
+ 結果的にサブクエリーをさらに集計するような仕組みが働いているので、遅いのではないかと思われます。
8
28
 
9
29
  基本に忠実に、SQLを組み立てると、必要なインデックスも明確になると思います。
10
30