ExistsReferrerのWhere句順序で悩み


final AaaCB cb = new AaaCB();
cb.query().existsXxxList(new SubQuery() {
public void query(XxxCB subCB) {
subCB.query().setXxx...;
}
});

↓↓↓

select ...
from AAA
where exists (select BBB_ID
from BBB
where BBB.xxx = ...
and BBB.AAA_ID = AAA.AAA_ID)

ですが、実開発で意外にかなり役に立ってます。
(多くの人に使ってもらっています)

ただこの機能でちょっと悩んでいるのが、副問い合わせ内のWhere句の順序です。
要は「BBB.AAA_ID = AAA.AAA_ID」を先にするのか利用者が付与した「BBB.xxx = ...」か。
はっきり言って、優れたOptimizerをもったDatabaseならどっちだって気にする必要は
ないかもしれませんが、自分の知っている限りMySQLではIndex利用に影響します(と聞いた)。

基本的にFKに関してはWhere句で利用される頻度が高いため、INDEXを付けられることが
予想されます。なので「BBB.AAA_ID = AAA.AAA_ID」を先にするのがいいのかなぁと。

一方で、そのFKにINDEXを付けるのはDB設計者であって自分ではないので、
そんな勝手に決め付けてしまっていいだろうかという気持ちもあり。
ApplicationでWhere句の最初に持っていきたい条件を指定できる方がいいかなぁと。

今は後者なのです。
でも、
where exists (select BBB_ID
from BBB
where BBB.VALID_FLG = 1
and BBB.AAA_ID = AAA.AAA_ID)
なんてPatternも多かったりして、
これだとすげー遅いSQLになっちゃうかも。

結局両方選べる方がいいに決まってるのね...

【追記(2008/12/31)】
その後色々議論して、
「BBB.AAA_ID = AAA.AAA_ID」
が先になっています。