6. パフォーマンスダウン時
? TABLE FULL SCANが実行されている
? しかし、現場的には実行計画の変化に気づいていない???
? 不要なブロックアクセスが大量に発生
SELECT * FROM tbl0 検索対象行
WHERE :sval < val AND val < :eval
1 10
:
15. 対処策1) SQLをリテラルに修正
? WHERE条件ごとに実行計画が作成される
– 子カーソル(≒実行計画)が共有されない
– 個々のWHERE条件に最適な実行計画が作成
される
SELECT * FROM tbl0 検索対象行
WHERE 1 < val AND val < 10
SELECT * FROM tbl0 検索対象行
WHERE 100 < val AND val < 5000 :
16. 対処策2) バインドピークを無効化
? _optim_peek_user_binds=false
? デフォルト値(*1)を基準に実行計画が作成される
– 子カーソル(≒実行計画)が共有される
– ある意味???平均的な実行計画が作成される
SELECT * FROM tbl0 検索対象行
WHERE :sval < val AND val < :eval
1 10
SELECT * FROM tbl0 検索対象行
WHERE :sval < val AND val < :eval :
100 5000
(*1) デフォルト値の例
'=', 'LIKE' の選択率 : 1/NUM_DISTINCT
そのほかの選択率 : 0.05
17. 対処策3) 実行計画を誘導
? 指定した実行計画が作成される
– 子カーソル(≒実行計画)が共有される
– どの実行計画に誘導するか?という問題が残る
SELECT /*+INDEX(tbl0) */ 検索対象行
* FROM tbl0
WHERE :sval < val AND val < :eval
1 10
SELECT /*+INDEX(tbl0) */ 検索対象行 :
* FROM tbl0
WHERE :sval < val AND val < :eval
100 5000
25. Adaptive Cursor Sharing (11.1-)
? 作成済みの実行計画(≒子カーソル)が不適
切な場合は、自動的に新規に子カーソルを作
成する機能
②
SELECT * FROM tbl0 検索対象行
WHERE :sval < val AND val < :eval
1 10
①
SELECT * FROM tbl0 検索対象行
WHERE :sval < val AND val < :eval
100 5000 ① :
SELECT * FROM tbl0 検索対象行 ②
WHERE :sval < val AND val < :eval
100 5000