【Oracle - 12c SQL基礎】part2 パフォーマンスに影響を与える条件文

お疲れ様です。

オラクルブロンズの範囲でパフォーマンスについて

触れることはあまりありませんがこれも実務で役にたちますので

ご紹介したいと思います。

教本はこちらを使用しています。

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)

 

Distinctはあまり性能が良くない?

重複行を省いて結果を出力するのに使うdistinctですが

暗黙的にソートが行われており性能があまり良くありません。

他にもunion, intersect , minus辺りは暗黙的にソートを行っており

よろしくないです。大規模なDBで実施する場合は

本当に必要か、代替の手段は無いか考え直してみると良いです。

IN と ORのコストは変わらない?

例えば以下のSQLを発行した際の性能は変わりません。

select * from EMPLOYEE

where emp_no in ('00001', '00002','00003');

 

select * from EMPLOYEE

where emp_no = '00001' 

or emp_no = '00002'

or emp_no = '00003');

 INを使う時の注意点としては条件を1000個まで指定できるが

指定しすぎるととてつもなく性能が悪化することです。

今までの経験上、10個ぐらいまでに抑えた方が良いと思われます。

LIKEを使うときに気を付けること

LIKE文を使うときに中間一致の条件指定を行うと索引が指定されている

項目にも関わらず索引が無効になる場合があります。

SQLの性能を考える上では、ヒットする件数が全体の10%以下の場合は

索引を使用して検索を行った方が早いです。しかし条件の指定方法が

悪いと索引が使用されない場合がありますのでご注意ください。

LIKEで前方一致の条件を指定した場合

f:id:peaceWalker:20180602192507p:plain

この場合索引(index)は有効です。

(実行計画が何か分からない方はググってください)

 

LIKEで中間一致の条件を指定した場合

f:id:peaceWalker:20180602192745p:plain

上記の様にFULLスキャンになりますので表の全量を検索するため

大規模なDBでは遅くなります。

IS NULL や NOT 条件もFULLスキャン?

条件の性質上、表の全量を検索しなければならないためFULLスキャンになります。

どうしても使わなければならない条件なのか検討した上で使うようにしましょう。

暗黙的なデータ型変換は索引(INDEX)が効かない場合がある?

条件を指定する際にはデータの型を合わせるようにしましょう。

データ型を合わせた場合

f:id:peaceWalker:20180602201641p:plain

VARCHAR型のデータに対してNUMBER型の条件を指定した場合

f:id:peaceWalker:20180602201709p:plain

これもFULLスキャンになりました。条件を指定する際はデータ型を意識しましょう。

 

表結合時に表接頭辞を指定するとパフォーマンスが良くなる?

例えば複数のテーブルを結合して結果を取得する際に

select するカラムをどの表から取得するか指定すると

わずかですがパフォーマンスが向上するとのことです。

 

SQLを作成する上でパフォーマンスは意識しなければならないですが

かなり高度な知識が必要となります。

※オラクルゴールドで取り扱う内容がほとんどだと思われます

 

パフォーマンスについて書かれている良い記事がありましたので

こちらも参照してみると良いかもしれません。

津島博士のパフォーマンス講座

 

ではでは