プログラマでありたい

おっさんになっても、プログラマでありつづけたい

S2JDBCのSQL自動生成で、結合条件を変えたい

 S2JDBCのSQL自動生成機能は、基本的に素晴らしいです。はるか昔にHibernateを使った時のもどかしさは、ほとんどありません。ただ、たまーに結合のチューニングしたいなぁと思うことがあります。

 例えば、AテーブルとBテーブルをジョインして、ページングで制限する場合です。
自動生成の場合、ジョインした結果に対して制限します。

SELECT
 *
FROM 
  (SELECT
     T1_.A_ID 
   FROM
     A_TABLE T1_
   left outer join B_TABLE T2_ on T1_.A_ID = T2_.A_ID
   WHERE
     (T1_.CD = 'hoge')
  )
WHERE
  rownum <= 100

 動きとしては、圧倒的に正しいです。
ただAテーブルとBテーブルがそれぞれ10万件あった場合は、かなりの時間が掛かります。検索の条件がAテーブルだけと確定している場合であれば、下記のようにAテーブルの検索条件+件数制限をしてBテーブルに結合した場合が圧倒的に早いです。

SELECT
  *
FROM
  (SELECT
      *
   FROM
      A_TABLE
   WHERE
     (T1_.CD = 'hoge')
     AND rownum <= 100
  ) T1_
left outer join B_TABLE T2_
  on T1_.A_ID = T2_.A_ID


 設計実装の話としては、一般的にはAテーブルだけ取得してJavaの中でBテーブルを呼び出して結合させるというのがモダンな造りだと思います。ただ、ごく稀にSQL的に完結させたいなぁという場合もあります。そんな時に、自動生成の方でもチューニング出来たらありがたいなぁと思います。(SQLファイルで書くと、色々制約がついて面倒臭いので)
 まぁ、フレームワークの設計思想としては、8割のケースに全力で対応して2割のケースを切り捨てるというのが正しいと思います。過去の肥大化して自壊していった数々の例をみていると。


 とここまで書いていて、.where("")でつらつら書いていけば出来るかなぁという気になってきました。