SQLチーニング
本日、技術ネタなのでわからない人はごめんなさい。
きょうは、摩訶不思議な状態に陥った。
SQLにて、外部結合の記述方法に「より、恐ろしいほど検索時間が違う結果が出た。
(外部結合の方法)
SELECT
*
FROM
TABLE1,
TABLE2
WHERE
TABLE1.KOOUMOKU = TABLE2.KOOUMOKU(+)
(JOINT文の記述)
SELECT
*
FROM
TABLE1 LEFT OUTER JOIN TABLE2
ON TABLE1.KOOUMOKU = TABLE2.KOOUMOKU
私は、上記の分両方とも同じ動きをするものだと思っている。
本当は、上記のような簡単な結合ではなく、5テーブルほど結合されているが、基本は上の通り。
なぜか、(外部結合の方法)では一瞬で検索結果が返ってくるのに、(JOINT文の記述)では、恐ろしく時間がかかる。
テーブルには、約60万件のデータが入っているので、ちょっとした記述ミスで遅くなることはあると思うが、何が違うのか良くわからない。
もちろん、結合する項目には、すべてINDEXが張ってある。
実は、(JOINT文の記述)の方で検索条件を変えたら、検索結果がすぐ戻ってきた。
違いは、検索条件を「Like」で検索するか「=」で検索するかの差だった。
ちなみに、(外部結合の方法)で「Like」検索しても、スピードが遅くなることはないんです。
これだけの情報で回答するのは難しいでしょうが、何か心当たりのある方は、返信お願いします。
私が知りたいのは、(外部結合の方法)と(JOINT文の記述)で論理的に同じ記述をした場合、データベース側(今回の場合はOracle)が内部でどのような処理を行っているか(たぶん、外部結合の場合Where句に結合条件を記述するので、Oracle側で条件絞り込んでから結合しているのではと読んでいますが...)が知りたいと思っています。
まあ、自分で実行計画を問い合わせして調べろとといわれればそれまでなのですが...
遅い時間に発生したもので、ろくに調べずに帰ってきてしまいました。
ちなみに、現在SQLで時間がかかるものについては、なぜかわからないが、(JOINT文の記述)を(外部結合の方法)に変更すると、スピードが上がるので、とりあえずそのような対処をしている始末です。
きょうは、摩訶不思議な状態に陥った。
SQLにて、外部結合の記述方法に「より、恐ろしいほど検索時間が違う結果が出た。
(外部結合の方法)
SELECT
*
FROM
TABLE1,
TABLE2
WHERE
TABLE1.KOOUMOKU = TABLE2.KOOUMOKU(+)
(JOINT文の記述)
SELECT
*
FROM
TABLE1 LEFT OUTER JOIN TABLE2
ON TABLE1.KOOUMOKU = TABLE2.KOOUMOKU
私は、上記の分両方とも同じ動きをするものだと思っている。
本当は、上記のような簡単な結合ではなく、5テーブルほど結合されているが、基本は上の通り。
なぜか、(外部結合の方法)では一瞬で検索結果が返ってくるのに、(JOINT文の記述)では、恐ろしく時間がかかる。
テーブルには、約60万件のデータが入っているので、ちょっとした記述ミスで遅くなることはあると思うが、何が違うのか良くわからない。
もちろん、結合する項目には、すべてINDEXが張ってある。
実は、(JOINT文の記述)の方で検索条件を変えたら、検索結果がすぐ戻ってきた。
違いは、検索条件を「Like」で検索するか「=」で検索するかの差だった。
ちなみに、(外部結合の方法)で「Like」検索しても、スピードが遅くなることはないんです。
これだけの情報で回答するのは難しいでしょうが、何か心当たりのある方は、返信お願いします。
私が知りたいのは、(外部結合の方法)と(JOINT文の記述)で論理的に同じ記述をした場合、データベース側(今回の場合はOracle)が内部でどのような処理を行っているか(たぶん、外部結合の場合Where句に結合条件を記述するので、Oracle側で条件絞り込んでから結合しているのではと読んでいますが...)が知りたいと思っています。
まあ、自分で実行計画を問い合わせして調べろとといわれればそれまでなのですが...
遅い時間に発生したもので、ろくに調べずに帰ってきてしまいました。
ちなみに、現在SQLで時間がかかるものについては、なぜかわからないが、(JOINT文の記述)を(外部結合の方法)に変更すると、スピードが上がるので、とりあえずそのような対処をしている始末です。
2005/02/24(Thu) 23:25:33 | お仕事
落としどころ
今は、年度末リリースできつい状態なので、合間に考えるだけでそれほど急いでいません。少し落ち着いてから、また本格的に調べてみたいと思っています。
その間、時間があるときにチョコチョコ調べてみますよ。
それと、昨日みたDBはテスト用であったため、実機でのテーブルを確認したところ、Analyzeされていませんでした。
連絡が遅くなってすみません。
なぜテスト環境だけAnalyzeされていたのか不思議ですが、現在現象が出ているのが実機ですので、現在はAnalyzeに関しては度外視して調査しています。