Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GroupBy と Distinct

Avatar for miyamiya miyamiya
February 16, 2014

GroupBy と Distinct

Avatar for miyamiya

miyamiya

February 16, 2014
Tweet

More Decks by miyamiya

Other Decks in Technology

Transcript

  1. group by と distinct を比べる • 某クラウド、メモリ2GB • レコード件数 10万件

    • Name カラムには 47都道府県名がランダムに入っている
  2. group by と distinct を比べる2 • 某クラウド、メモリ2GB • レコード件数 10万件

    • Name カラムには 47都道府県名がランダムに入っている
  3. 検証する方法 • EXPLAIN で実際の実行時間を計測する • 検証するパターン – Name カラムにインデックスをはらない •

    EXPLAIN ANALYZE select distinct on (name) name FROM pgtest; • EXPLAIN ANALYZE select distinct name FROM pgtest; • EXPLAIN ANALYZE select name from pgtest group by name; – Name カラムにインデックスをはる • EXPLAIN ANALYZE select distinct on (name) name FROM pgtest; • EXPLAIN ANALYZE select distinct name FROM pgtest; • EXPLAIN ANALYZE select name from pgtest group by name;
  4. スピードを計測 • PostgreSQL7.4 – EXPLAIN ANALYZE select distinct on (name)

    name FROM pgtest; • 実行計画:Unique → Sort → Seq Scan on pgtest • 実行時間:3223.304 ms – EXPLAIN ANALYZE select distinct name FROM pgtest; • 実行計画:Unique → Sort → Seq Scan on pgtest • 実行時間:3206.429 ms – EXPLAIN ANALYZE select name from pgtest group by name; • 実行計画:HashAggregate → Seq Scan on pgtest • 実行時間:272.049 ms
  5. スピードを計測 • PostgreSQL7.4(インデックスあり) – EXPLAIN ANALYZE select distinct on (name)

    name FROM pgtest; • 実行計画:Unique → Sort → Seq Scan on pgtest • 実行時間:3219.604 ms – EXPLAIN ANALYZE select distinct name FROM pgtest; • 実行計画:Unique → Sort → Seq Scan on pgtest • 実行時間:3217.941 ms – EXPLAIN ANALYZE select name from pgtest group by name; • 実行計画:HashAggregate → Seq Scan on pgtest • 実行時間:267.396 ms
  6. スピードを計測 • PostgreSQL8.4 – EXPLAIN ANALYZE select distinct on (name)

    name FROM pgtest; • 実行計画:Unique → Sort → Seq Scan on pgtest • 実行時間:2785.410 ms – EXPLAIN ANALYZE select distinct name FROM pgtest; • 実行計画:HashAggregate → Seq Scan on pgtest • 実行時間:233.662 ms – EXPLAIN ANALYZE select name from pgtest group by name; • 実行計画:HashAggregate → Seq Scan on pgtest • 実行時間:230.086 ms
  7. スピードを計測 • PostgreSQL8.4(インデックスあり) – EXPLAIN ANALYZE select distinct on (name)

    name FROM pgtest; • 実行計画:Unique → Index Scan using pgtest_idx1 on pgtest • 実行時間:267.068 ms – EXPLAIN ANALYZE select distinct name FROM pgtest; • 実行計画:Unique → Index Scan using pgtest_idx1 on pgtest • 実行時間:267.044 ms – EXPLAIN ANALYZE select name from pgtest group by name; • 実行計画:HashAggregate → Seq Scan on pgtest • 実行時間:231.749 ms
  8. スピードを計測 • PostgreSQL9.3 – EXPLAIN ANALYZE select distinct on (name)

    name FROM pgtest; • 実行計画:Unique → Sort → Seq Scan on pgtest • 実行時間:2902.322 ms – EXPLAIN ANALYZE select distinct name FROM pgtest; • 実行計画:HashAggregate → Seq Scan on pgtest • 実行時間:239.562 ms – EXPLAIN ANALYZE select name from pgtest group by name; • 実行計画:HashAggregate → Seq Scan on pgtest • 実行時間:235.504 ms
  9. スピードを計測 • PostgreSQL9.3(インデックスあり) – EXPLAIN ANALYZE select distinct on (name)

    name FROM pgtest; • 実行計画:Unique → Index Only Scan using pgtest_idx1 on pgtest • 実行時間:222.463 ms – EXPLAIN ANALYZE select distinct name FROM pgtest; • 実行計画:HashAggregate → Seq Scan on pgtest • 実行時間:239.562 ms – EXPLAIN ANALYZE select name from pgtest group by name; • 実行計画:HashAggregate → Seq Scan on pgtest • 実行時間:235.504 ms
  10. 結論 • PostgreSQL のバージョンによって動作が違う • インデックスのありなしでも動作が変わる • Group by を使ったほうがどのバージョンでも

    問題なく安定的に動作する • 用途が違うので、違いを理解してケースバイ ケースで使い分けることが重要
  11. 結論 • PostgreSQL のバージョンによって動作が違う • インデックスのありなしでも動作が変わる • Group by を使ったほうがどのバージョンでも

    問題なく安定的に動作する • 用途が違うので、違いを理解してケースバイ ケースで使い分けることが重要 • 都道府県は 46 に減ったらしい ←NEW!!