@@ -188,7 +188,6 @@ LATERAL版: 233ms / 47% ← 不要な二重スキャン
188188| 原因 | 詳細 |
189189| -------------------- | ----------------------------------------- |
190190| ` ::NUMERIC ` キャスト | 任意精度演算 → CPU ネイティブより** 低速** |
191- | ` WHERE IS NOT NULL ` | 全行フィルタスキャンの追加コスト |
192191
193192---
194193
@@ -200,26 +199,24 @@ LATERAL版: 233ms / 47% ← 不要な二重スキャン
200199
201200SELECT
202201 query_name,
203- ROUND(AVG (rating * 1 . 0 / position)::NUMERIC , 2 ) AS quality,
202+ ROUND(AVG (rating::float8 / position)::NUMERIC , 2 ) AS quality,
204203 ROUND(
205204 COUNT (* ) FILTER (WHERE rating < 3 ) * 100 .0 / COUNT (* ),
206205 2
207206 ) AS poor_query_percentage
208207FROM Queries
208+ WHERE query_name IS NOT NULL
209209GROUP BY query_name;
210210```
211211
212212### 変更点の差分
213213
214214``` diff
215215- ROUND(AVG(rating::NUMERIC / position), 2)
216- + ROUND(AVG(rating * 1.0 / position)::NUMERIC, 2)
216+ + ROUND(AVG(rating::float8 / position)::NUMERIC, 2)
217217
218- -- ↑ 中間計算を FLOAT(* 1.0) で行い、最後だけ NUMERIC にキャスト
218+ -- ↑ 中間計算を float8(倍精度浮動小数点) で行い、最後だけ NUMERIC にキャスト
219219 -- NUMERIC演算はソフトウェア実装 → FLOATはCPUネイティブ命令で高速
220-
221- - WHERE query_name IS NOT NULL
222- -- ↑ 問題の制約上 NULL は存在しないため削除
223220```
224221
225222---
@@ -229,14 +226,16 @@ GROUP BY query_name;
229226``` mermaid
230227flowchart TD
231228 A["Queries テーブル\nフルスキャン O(N)"]
229+ A_F["WHERE query_name IS NOT NULL\nNULL行を除外"]
232230 B["GROUP BY query_name\nHash Aggregate"]
233- C["AVG(rating * 1.0 / position)\nFLOAT演算 CPU ネイティブ ⚡"]
231+ C["AVG(rating::float8 / position)\nFLOAT演算 CPU ネイティブ ⚡"]
234232 D["FILTER(rating < 3)\nCOUNT条件集計"]
235233 E["::NUMERIC キャスト\n最後の1回のみ"]
236234 F["ROUND(..., 2)"]
237235 G["出力"]
238236
239- A --> B
237+ A --> A_F
238+ A_F --> B
240239 B --> C & D
241240 C --> E
242241 D --> E
@@ -255,7 +254,7 @@ flowchart TD
255254【遅い】 rating::NUMERIC / position
256255 ↑全行でNUMERIC(任意精度)演算 → ソフトウェアエミュレーション
257256
258- 【速い】 rating * 1.0 / position
257+ 【速い】 rating::float8 / position
259258 ↑FLOAT64演算 → x86 FPU / SIMD 命令で処理
260259 最後に ::NUMERIC は ROUND() のため1回だけ
261260```
0 commit comments