- PR -

SQL文の副問合せについて

投稿者投稿内容
走り幅跳び
常連さん
会議室デビュー日: 2007/02/27
投稿数: 36
投稿日時: 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検索が行われています。

宜しくお願い致します。
johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2008-01-28 14:35
引用:

225さんの書き込み (2008-01-28 13:44) より:
SELECT * FROM TABLE1 WHERE CODE1 in (SELECT CODE1 FROM TABLE2 WHERE ・・・・・)


これの「・・・・・」部分が気になります。
副問合せの結果の中にNULLが含まれるような事はないですよね?
また、ここでいうCODE1がNULLを許容している項目であればINDEXが適用されなくなる場合があった気がします。

#すいません、情報のソースは見つけられてないです。
走り幅跳び
常連さん
会議室デビュー日: 2007/02/27
投稿数: 36
投稿日時: 2008-01-28 14:59
レスありがとうございます。

SELECT * FROM TABLE1 WHERE CODE1 in
(SELECT CODE1 FROM TABLE2 WHERE LINE = '5001' AND SUB = '0')
の様な感じです。
CODE1は主キーになっていますので、nullにはなりません。

宜しくお願い致します。
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2008-01-28 15:24
INのかわりに EXISTSを使えば、索引が適用されませんか?
コード:
SELECT * FROM TABLE1 t1
 WHERE EXISTS
       (SELECT * FROM TABLE2 t2
         WHERE t2.CODE1 = t1.CODE1
           AND LINE = '5001' AND SUB = '0');


また、TABLE1, TABLE2 の索引はどのように定義されていますか?
johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2008-01-28 16:15
引用:

225さんの書き込み (2008-01-28 14:59) より:
レスありがとうございます。

SELECT * FROM TABLE1 WHERE CODE1 in
(SELECT CODE1 FROM TABLE2 WHERE LINE = '5001' AND SUB = '0')
の様な感じです。
CODE1は主キーになっていますので、nullにはなりません。

宜しくお願い致します。



なるほど。TABLE1.CODE1, TABLE2.CODE2両者に対してINDEXが張られていてNOT NULL制約があれば普通にINDEXが適用されそうな気はしますけどね。。。なぜだろう。。。

225さんの書き込み (2008-01-28 13:44) より:
私は「あくまで"IN句を使った場合にINDEXが適用されない原因が知りたい"」と読み取ったので、あえてEXISTS句については触れなかったのですが、「"INDEXが適用されること"が目的」なのであればとんくまさんがおっしゃる通りで適用されるかと思います。
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2008-01-28 16:19
saki1208です。

INはインデックス使用されなかったと思います。
どうしても副問い合わせでなければならない場合を
除いては結合の方が良いのでは?
走り幅跳び
常連さん
会議室デビュー日: 2007/02/27
投稿数: 36
投稿日時: 2008-01-28 17:08
>とんくまさん

ありがとうございます。

TABLE1は、主キーがCODE1
TABLE2は、主キーがCODE1,DATE
となっています。
記述が足りませんでしたが、
TABLE2は、主キーがCODE1だけではありません。

とんくまさんが書かれたように、EXISTSを使用しましたが、
TABLE1の検索に関しては全検索になってしまいました。


>johnes さん

ありがとうございます。

記述が足りなくて申し訳ありません。
CODE1単独がキーではないのですが、
CODE1に対してNOT NULL制約はあります。

特に in にこだわっていた訳ではありませんので、
他の方法も考えようかと思います。

>saki1208 さん
ありがとうございます。

そうなのですか。知りませんでした。
副問合せにこだわる必要はありませんので、
結合を利用しようと思います。
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2008-01-28 17:47
CREATE TABLE,CREATE INDEX文やEXPLAINの結果をそのまま
アップしてはいかがでしょう。
そのほうが正確に伝わりますよ。

スキルアップ/キャリアアップ(JOB@IT)