MW211 EXIT

devlog
PostgreSQL/avg()の精度
2013年05月15日
「avg()」と「sum()÷count()」に違いがあるか実験してみた。
┌──────────────────────────────────────┐
│WITH "data"("value") AS (                                                   │
│         SELECT trunc(random() * 10000)         --サンプル値の幅(0~9999)   │
│             FROM generate_series(1, 10000, 1)  --サンプル数(10000件)       │
│     )                                                                      │
│SELECT CASE                                                                 │
│         WHEN "avg" = ("sum" / "count") THEN '一致'                         │
│         ELSE                                '不一致'                       │
│       END AS "判定",                                                       │
│       "avg"           AS "平均",                                           │
│       "sum" / "count" AS "合計÷件数"                                      │
│    FROM (SELECT avg("value")   AS "avg",                                   │
│                 sum("value")   AS "sum",                                   │
│                 count("value") AS "count"                                  │
│              FROM "data"                                                   │
│         ) AS "as_data";                                                    │
└──────────────────────────────────────┘
違いはないみたい(同じロジックなのか?)。

ついでに実行計画をみてみた。
┌──────────────────────────────────────┐
│EXPLAIN                                                                     │
│SELECT avg(列) FROM 表;                                                     │
├──────────────────────────────────────┤
│Aggregate  (cost=コスト rows=行数 width=行幅)"                              │
│  ->  Seq Scan on 表  (cost=コスト rows=行数 width=行幅)"                   │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│EXPLAIN                                                                     │
│SELECT sum(列) / count(列) FROM 表;                                         │
├──────────────────────────────────────┤
│Aggregate  (cost=コスト rows=行数 width=行幅)"                              │
│  ->  Seq Scan on 表  (cost=コスト rows=行数 width=行幅)"                   │
└──────────────────────────────────────┘
ほぼ同じ。ほんのちょっとだけ後者の方がコストが高いようだ。
#やっぱりまわりくどいと最適化には悪影響なの?
分類:PostgreSQL