[CodeIgniter] クエリビルダ(Active Record)で発行されるSQLを確認する

スロークエリを探す際などに、CodeIgniterのクエリビルダ(Active Record)がどのようなSQL文を発行しているのかをチェックしたい時があります。今回は、クエリビルダを使ったSQL文の確認方法をみていきます。

get_compiled_***でSQLのみを発行してくれる

CodeIgniterのクエリビルダ(Active Record)には、get_compiled_***というメソッドが用意されています。このメソッドは、ビルドした内容を「実行するのではなくて、コンパイルして文字列として返す」、つまりSQL文を表示させるだけのメソッドです。

***の部分は使う方法によって変わって、

  • SELECT (get_compiled_select)
  • UPDATE (get_compiled_update)
  • INSERT (get_compiled_insert)
  • DELETE (get_compiled_delete)

の4種類が使えます。

注意したいのは、いずれもクエリを一回処理した扱いになるので、get_compiled_***を一度実行すると、その前までにビルドしたクエリはリセットされます。リセットされないようにするには、第2引数にFALSEをセットします。

実際に使って見る

下記のようなタグ縛りの記事一覧を取得するメソッドがあった場合、

public function ListArticle($tag){
    $this->DB1 = $this->load->database('default', TRUE, TRUE);
    $this->DB1->select('*');
    $this->DB1->from("articles");
    $this->DB1->where("tag", $tag);
    $query = $this->DB1->get();
    $result = $query->result_array();
    return $result;
} 

クエリを実行する前にget_compiled_select()を実行して出力すればSQL文が確認できます。

public function ListArticle($tag){
    $this->DB1 = $this->load->database('default', TRUE, TRUE);
    $this->DB1->select('*');
    $this->DB1->from("articles");
    $this->DB1->where("tag", $tag);

    //ここから
    $test = $this->DB1->get_compiled_select("", FALSE);
    var_dump($test);
    //ここまで

    $query = $this->DB1->get();
    $result = $query->result_array();
    return $result;
} 
string(45) "SELECT * FROM "articles" WHERE "tag" = "blog"" 

今回は、var_dumpでSQLを表示させたらそのまま処理は実行して欲しかったので、get_compiled_selectの第2引数にFALSEを設定して、クエリ内容を保持する設定にしています。

ピンポイントでSQL文だけをチェックしたい場合は、var_dump後にdieで処理を停止させたりしても良いでしょう。


自分の場合は、DBに関連するメソッドを新しく作った時やDBの速度が気になった時などに、テスト環境でget_compiled_***を使って一時的にSQL文を発行して、phpliteadminで実行速度を確認したり、インデックスが適切に使われているかなどをチェックしています。

運用を続けている限りデータベースのメンテナンスは継続されるので、さくっとチェックできるget_compiled_***メソッドは覚えておくと、便利です。