とりあえすDISTINCT

先日、検索期間広げて実行するとタイムアウトエラー頻発するクエリを調査したところ、DISTINCT が原因だったこと判明しました。
DISTINCT を使った場合、EXPLAIN では最初の行の Extra に Using temporary が発生してたが、DISTINCT 外すと Using temporary が消え、実行速度が0.5秒以下に収まりました。DISTINCT の一句の有無でここまで速度が変わるとは・・・かなり驚きでした!

そもそもなんでこのクエリで DISTINCT 使ってたのか・・・・・複雑なクエリのため抽出レコードに重複が発生する恐れがあり、重複回避のため DISTINCT を使っていたと。とりあえず保険のため DISTINCT 付けときゃいいや的な感じ・・・実はこれ書いたの私なんですけどね(大汗) 数年前に書いたクエリのため、DISTINCT 付けた意図思い出すまでしばらく時間かかったです。ハイw

重複レコード返すかも知れない糞クエリ書いたのも問題なら、そもそも重複ないようテーブル設計しっかり行えてないのも問題だと感じました。


昨日の勉強会、「理論から学ぶデータベース実践入門 Night」にて著者の奥野さんが、リレーショナル理論に基づきテーブル設計行う重要性について

「データベースちゃんと使ってなくて性能出ないとか言ってる人いたら、私の前に連れて来てください」

と力説しておられたが、データを重複・矛盾なく正しく格納するため、リレーショナルモデル(および正規化理論)がデータベースに如何に必要な道具なのか、改めて認識した次第でした。