【Oracle - 12c SQL基礎】part2 パフォーマンスに影響を与える条件文
お疲れ様です。
オラクルブロンズの範囲でパフォーマンスについて
触れることはあまりありませんがこれも実務で役にたちますので
ご紹介したいと思います。
教本はこちらを使用しています。
【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)
- 作者: エディフィストラーニング株式会社,西昭彦,飯室美紀,鈴木佐和,岡野友紀,矢島祐子
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/03/21
- メディア: 単行本
- この商品を含むブログ (2件) を見る
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で前方一致の条件を指定した場合
この場合索引(index)は有効です。
(実行計画が何か分からない方はググってください)
LIKEで中間一致の条件を指定した場合
上記の様にFULLスキャンになりますので表の全量を検索するため
大規模なDBでは遅くなります。
IS NULL や NOT 条件もFULLスキャン?
条件の性質上、表の全量を検索しなければならないためFULLスキャンになります。
どうしても使わなければならない条件なのか検討した上で使うようにしましょう。
暗黙的なデータ型変換は索引(INDEX)が効かない場合がある?
条件を指定する際にはデータの型を合わせるようにしましょう。
データ型を合わせた場合
VARCHAR型のデータに対してNUMBER型の条件を指定した場合
これもFULLスキャンになりました。条件を指定する際はデータ型を意識しましょう。
表結合時に表接頭辞を指定するとパフォーマンスが良くなる?
例えば複数のテーブルを結合して結果を取得する際に
select するカラムをどの表から取得するか指定すると
わずかですがパフォーマンスが向上するとのことです。
SQLを作成する上でパフォーマンスは意識しなければならないですが
かなり高度な知識が必要となります。
※オラクルゴールドで取り扱う内容がほとんどだと思われます
パフォーマンスについて書かれている良い記事がありましたので
こちらも参照してみると良いかもしれません。
ではでは