質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

3869閲覧

INDEXを使う結合方法

am3

総合スコア10

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2019/02/22 06:57

お世話になります。
ORACLE SQLは、EUCレベルで少しかじって自分の業務には役立っているのですが、深い知識はありません。
社内にも詳しい方がいません。どなたかご教示下されば幸いです。
よろしくお願い致します。

前提・実現したいこと

SELECT文で、TB001 と TB002 をLEFT JOINしていますが、
INDEXを使っていなかったので、色々書き方を変えてみたのですが、
「試したこと」の様に記述すると、INDEXを使ってくれるようになりました。
(OBJECT BROWSER の実行計画で確認しました)

こんなことってあるのでしょうか?
実行計画のCOSTの数値は、「試したこと」の方が少なくなっていて、実行時間も早くなっています。

※TB002に、UNIQUE INDEX で COD(CHAR) が設定されています。

該当のソースコード

FROM TB001 A
LEFT JOIN TB002 B
ON (A.COD = B.COD) --これだけだとINDEXを使わない

試したこと

FROM TB001 A
LEFT JOIN TB002 B
ON (A.COD = B.COD)
AND (A.COD = B.COD) --2回書くとINDEXを使うようです

補足情報(FW/ツールのバージョンなど)

Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production
Oracle Client 11.2.0.1.0 Production

使用ツール
OBJECT BROWSER 13
A5:SQL Mk-2 VER.2.14.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/02/22 07:19

ON (A.COD = B.COD) の括弧() を外してみてください。
am3

2019/02/22 07:54

hihijiji様 こんにちは。 情報ありがとうございます。 かっこを外して試してみます。 結果は後程投稿させて頂きます。 どうもありがとうございます。
guest

回答1

0

先ずは統計情報は取得されていますか?
統計情報が取得されておらず、少ない件数の統計情報だったりするとインデックスが使用されない場合があります。
Oracleの統計情報にまつわる頻出FAQ~概要、確認、収集・取得

統計情報が取得されている状態で、

TB002に、UNIQUE INDEX で COD(CHAR)
ON (A.COD = B.COD) AND (A.COD = B.COD) --2回書くとINDEXを使うようです

ということなら、「2回アクセスするならインデックス使った方が効率いいよね」とオプチマイザーが判断しているのでしょう。

正しくインデックスが使用されるためには、SQL全体を見ないと駄目です。
結合条件を切り出しただけでは、インデックスが使われるようには制御できません。
インデックスの使用を強制するにはヒント文が有効です。
第55回 オプティマイザ・ヒントについて

投稿2019/02/22 07:16

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

am3

2019/02/22 07:28 編集

sazi様 こんにちは。 早速のご回答ありがとうございます。 リンク先のページを拝見しました。かゆい所に手が届くといったような内容で、大変勉強になります。 システム管理者に相談してみます。 どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問