思いつくままプログラミングネタを書き殴ります。PL/pgSQLで動的SQLを書く必要がなくなったちょっと古いですけどPostgreSQL9.2のリリースノートに「プリペアド文が使われる場合であっても、特定のパラメータ値のための特別な計画をプランナが生成できるようにしました。2番目にあるくらいなので重要だと思うのですが、当時見た私は何のことだかわからずスルーしていたようです。「以前は、プリペアド文は必ず1つだけの"一般的な"計画があり、それがすべてのパラメータ値に対して使われていました。これは、明示的な定数値を持つプリペアドでない文で使われる計画に比べ、大幅に劣ることが時々ありました。これからは、プランナは、特定のパラメータ値に対して特別な計画を生成しようとします。特別な計画による利点がないことが繰り返し証明された後になって初めて、一般的な計画が使われます。この変更により、以前からあった、(PL/pgSQLの動的でない文を含め)プリペアド文を使うことによるパフォーマンスの不利を排除できます。」これ重要なのは最後の文章で、以前はPL/pgSQLを使うと動的でない素のSQLを書くとインデックスが効かずにまるでパフォーマンスがでませんでした。ほとんどすべて動的SQLで書くことになっていました。ところが、このリリースノートによればそれが解消されているとなります。なると直感的に動的SQLを使っているほうが、都度SQLがパースされるため重くなるんじゃないかと思いました。いうことで、検証してみました。以下、使用したSQLです。plpgsql;これをrubyから呼んでみます。sec"データは10,000,000件作成。insert_test(10000000)sel_test2,3,4を100,000回呼び出してみました。sec結論としては、PL/pgSQLでは素のSQLが速度が速いです。PL/pgSQLを多段に呼ぶのはそんなに重くないようです。動的SQLは確かに遅いですが、そこまで速度にシビアでなければ便利に利用すれば良いと思います。(12/28)PostgreSQLとRubyを組み合わせてブラックリストチェックの速度を測ってみた。