ここから本文です

sqlのパフォーマンスについて質問です。 dbはoracleを利用しています。 以下の...

jup********さん

2014/6/611:30:50

sqlのパフォーマンスについて質問です。
dbはoracleを利用しています。

以下の修正前のsqlのパフォーマンスが著しく悪かったため、
修正後のsqlのように、where句に一つ条件追加したところ

、劇的に改善しました。
条件追加した理由は、正直なところカンでした。なので、パフォーマンスが改善したことに逆に驚いてます。
このように不要とも思える抽出条件を追加することで、パフォーマンスが変わることはあるのでしょうか❔

◼︎修正前
select

from
tbl_a a
,tbl_b b
,tbl_c c
where
a.col_1 = b.col_1
and a.col_1 = c.col_1

◼︎修正後
select

from
tbl_a a
,tbl_b b
,tbl_c c
where
a.col_1 = b.col_1
and a.col_1 = c.col_1
and b.col_1 = c.col_1 --追加条件

閲覧数:
47
回答数:
3
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

2014/6/701:19:40

”不要と思える抽出条件”、とありますが、修正前と修正後ではSQL文の条件が違っていますよね。
どちらでも結果が変わらない、としてもたまたまそのようなデータになっているだけです(col_1列の値がtab_a、tab_b、tab_c全てに共通している、など)

WHERE句の条件が変わったことで結合条件が変わり、実行計画が変更されたものと思います。

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

ent********さん

2014/6/708:13:19

> このように不要とも思える抽出条件を追加することで、パフォーマンスが変わることはあるのでしょうか❔

結論から言えばあり得ることです。

ただ、普通は Oracle が書き換えてくれるはずなんですけど・・・実際に書かれたSQLもこんなに簡単なものでしたか?

あと、どちらも最新の統計情報のもとで、ハードパースされる条件 (インスタンス起動直後または共有プールをフラッシュした後) で実行されましたか?

このように、いろんな要素によって、人間にとっては同じに見えるSQLがOracleにとって同じではなかったりします。

いずれにしても、他の方も言われているように、実行計画を見てみないことになんとも言えません。比較的簡単なAUTOTRACEを試してみてはいかがでしょうか。

SQL> connect / as sysdba
SQL> @?/sqlplus/admin/plustrce.sql
SQL> grant plustrace to <user>;
SQL> connect <user>/<pass>
SQL> set autotrace on

---- それぞれのSQLを実行 ----

bun********さん

2014/6/702:54:21

実行計画は取って理解しましたか?

修正前は、
cテーブルは全権検索
bテーブルは全件検索
aテーブルは1件検索(col_1が主キーの場合)
です。
『cテーブルの全件×bテーブルの全件』の件数を検索する時間がかかります。

修正後は、
cテーブルは全件検索
bテーブルは1件検索(col_1が主キーの場合)
aテーブルは1件検索(col_1が主キーの場合)
です。
『cテーブルの全件』を検索する時間と同等の時間で抽出可能です。

理由は、結合方法と検索順です。
ちなみに、本当に不要な条件文は『and a.col_1 = c.col_1』です。
こちらを削除しても抽出時間は同じくらいのはずです。


・・とはいえ、私がこのSQLをチェックする人間であれば、
設計以前に、ヒント句がなくてNGを出しちゃいます。
(ヒント句として、USE_NLとINDEXを記載して、本来あるべき姿に変更してあげると良いかと思います)

設計面では、WHERE句ではなく、LEFT JOINで記載した方が分かりやすいかもしれませんね。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる