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

回答編集履歴

3

推敲

2018/11/14 12:36

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  これを、`location_id`, `product_id`単位で集計としていますが、じゃあ、`引当総数`と`ロケ内総在庫数`はどんな集計されているの?って事です。これらは集計されず適当な何れかの値が採用されています。
12
12
  相関問い合わせなので、それらの相関内の何れかの値が使用されていますが、何れも同じ値なので、求めたいものと同じになっているに過ぎません。
13
13
 
14
- 結果的にサブクエリーをさらに集計するような仕組みが働いているので、遅いのではないかと思われます。
14
+ 結果的にサブクエリーをさらに集計するような仕組みが働いて、遅いのではないかと思われます。
15
15
  基本に忠実に、SQLを組み立てると、必要なインデックスも明確になると思います。
16
16
 
17
17
  性能が改善するかどうかわかりませんが、素直にキーを揃えるように組み立てると以下のようなSQLになるのではないかと。

2

推敲

2018/11/14 12:36

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  結果的にサブクエリーをさらに集計するような仕組みが働いているので、遅いのではないかと思われます。
15
15
  基本に忠実に、SQLを組み立てると、必要なインデックスも明確になると思います。
16
16
 
17
- 性能が改善するかどうかわかりませんが、素直に組み立てると以下のようなSQLになるのではないかと。
17
+ 性能が改善するかどうかわかりませんが、素直にキーを揃えるように組み立てると以下のようなSQLになるのではないかと。
18
18
  ```SQL
19
19
  select stk.location_id AS 'ロケーションID'
20
20
  , stk.product_id AS '商品ID'

1

追記

2018/11/14 12:34

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,7 +1,17 @@
1
1
  `引当総数`や`ロケ内総在庫数`は`location_id`と`product_id`の組み合わせで一意であったり、値が変わらない為、MySQLの仕様([12.19.3 MySQL での GROUP BY の処理](https://dev.mysql.com/doc/refman/5.6/ja/group-by-handling.html))によって容認された結果に過ぎません。
2
2
  ※他のDBMSなら文法エラー
3
+ 説明します。
4
+ 先ず集計前の状態の以下のSQLは正しい結果だと思います。
5
+ ```SQL
6
+ SELECT location_id, product_id, stock_num
7
+ , IFNULL((SELECT SUM(bst.bought_num) FROM BoughtStock bst WHERE bst.stock_id = stk.stock_id), 0) AS '引当総数'
8
+ , (SELECT SUM(stk2.stock_num) FROM Stock stk2 WHERE stk2.location_id = stk.location_id) AS 'ロケ内総在庫数'
9
+ FROM Stock
10
+ ```
11
+ これを、`location_id`, `product_id`単位で集計としていますが、じゃあ、`引当総数`と`ロケ内総在庫数`はどんな集計されているの?って事です。これらは集計されず適当な何れかの値が採用されています。
12
+ 相関問い合わせなので、それらの相関内の何れかの値が使用されていますが、何れも同じ値なので、求めたいものと同じになっているに過ぎません。
3
13
 
4
- サブクエリーをさらに集計するような仕組みが働いているので、遅いのではないかと思われます。
14
+ 結果的にサブクエリーをさらに集計するような仕組みが働いているので、遅いのではないかと思われます。
5
15
  基本に忠実に、SQLを組み立てると、必要なインデックスも明確になると思います。
6
16
 
7
17
  性能が改善するかどうかわかりませんが、素直に組み立てると以下のようなSQLになるのではないかと。