- - PR -
SQL文の副問合せについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-01-28 13:44
いつもご利用させております。
現在、Oracle10gにて副問合せを利用したSQL文を作成したのですが、 INDEXが利用されません。 SELECT * FROM TABLE1 WHERE CODE1 in (SELECT CODE1 FROM TABLE2 WHERE ・・・・・) と記述すると、 EXPLAIN処理にて、TABLE1に対して全検索をしていると表示されます。 副問合せを利用すると、INDEXが利用されないのでしょうか? ちなみに、 SELECT * FROM TABLE1 WHERE CODE1 in ('0001','0002'.'0003') と記述するとINDEX検索が行われています。 宜しくお願い致します。 | ||||
|
投稿日時: 2008-01-28 14:35
これの「・・・・・」部分が気になります。 副問合せの結果の中にNULLが含まれるような事はないですよね? また、ここでいうCODE1がNULLを許容している項目であればINDEXが適用されなくなる場合があった気がします。 #すいません、情報のソースは見つけられてないです。 | ||||
|
投稿日時: 2008-01-28 14:59
レスありがとうございます。
SELECT * FROM TABLE1 WHERE CODE1 in (SELECT CODE1 FROM TABLE2 WHERE LINE = '5001' AND SUB = '0') の様な感じです。 CODE1は主キーになっていますので、nullにはなりません。 宜しくお願い致します。 | ||||
|
投稿日時: 2008-01-28 15:24
INのかわりに EXISTSを使えば、索引が適用されませんか?
また、TABLE1, TABLE2 の索引はどのように定義されていますか? | ||||
|
投稿日時: 2008-01-28 16:15
なるほど。TABLE1.CODE1, TABLE2.CODE2両者に対してINDEXが張られていてNOT NULL制約があれば普通にINDEXが適用されそうな気はしますけどね。。。なぜだろう。。。 225さんの書き込み (2008-01-28 13:44) より: 私は「あくまで"IN句を使った場合にINDEXが適用されない原因が知りたい"」と読み取ったので、あえてEXISTS句については触れなかったのですが、「"INDEXが適用されること"が目的」なのであればとんくまさんがおっしゃる通りで適用されるかと思います。 | ||||
|
投稿日時: 2008-01-28 16:19
saki1208です。
INはインデックス使用されなかったと思います。 どうしても副問い合わせでなければならない場合を 除いては結合の方が良いのでは? | ||||
|
投稿日時: 2008-01-28 17:08
>とんくまさん
ありがとうございます。 TABLE1は、主キーがCODE1 TABLE2は、主キーがCODE1,DATE となっています。 記述が足りませんでしたが、 TABLE2は、主キーがCODE1だけではありません。 とんくまさんが書かれたように、EXISTSを使用しましたが、 TABLE1の検索に関しては全検索になってしまいました。 >johnes さん ありがとうございます。 記述が足りなくて申し訳ありません。 CODE1単独がキーではないのですが、 CODE1に対してNOT NULL制約はあります。 特に in にこだわっていた訳ではありませんので、 他の方法も考えようかと思います。 >saki1208 さん ありがとうございます。 そうなのですか。知りませんでした。 副問合せにこだわる必要はありませんので、 結合を利用しようと思います。 | ||||
|
投稿日時: 2008-01-28 17:47
CREATE TABLE,CREATE INDEX文やEXPLAINの結果をそのまま
アップしてはいかがでしょう。 そのほうが正確に伝わりますよ。 |