« [メモ]サクラエディタでの改行コード除外 | トップページ | PostgreSQLユーザー(ロール)のoidを調べる »

2014.05.29

特定のインデックスを強制利用

基本的にはこの技はワークアラウンド以外では禁忌だと思ってる。
データの状況というのは日々刻々変わっていくわけであり、最適なインデックスがどれであるのか、というのはある日突然変わってしまうかもしれない。
その意味でオプティマイザに委ねることを基本方針として、オプティマイザが賢い振る舞いをするように設定をしてあげるのが為すべき道だと思う。

とはいうものの、「どうしてもこのインデックスをこの検索時には使って欲しい!」という需要があるのも理解できる。
で、いくつかのDBMSではインデックスの強制使用が指定できるので、その情報をメモり。

 

PostgreSQL:できない

いきなりできないDBMSを書いてしまったw
私がインデックス強制使用を好まないのはPostgreSQLの設計思想に従ってるせいかもしれないと思い始めた。
なお、既述のとおり直接的にどのインデックスを使用するのかは指定できないが、オプティマイザに対して実行計画作成方針を示してやることはできる。
ref)[プランナをだまして実行計画を誘導する]

 

Informix:できる

SELECT句の直後に{+index(インデックス名)}と指定することで特定のインデックスの利用を強制できる。

SELECT {+index(table hoge_index2)} * FROM hogehoge;

こんな感じ。

 

Oracle:できる

有名なヒント句である。書式はInformixとも似ている。

SELECT /*+ INDEX(hogehoge hoge_index2) */ FROM hogehoge;

こんな感じ。
Oracleのヒント句はインデックスだけでなく、JOINの順番やその他の振る舞いについてもオプティマイザに指示できる。これはPostgreSQLの実行計画パラメータ設定が概念的には近いかな。

 

MySQL:できる

SELECT * FROM hogehoge USE INDEX (hoge_index2);

こんな感じ。
MySQLでは他にもIGNORE INDEXとかFORCED INDEXというバリエーションもあり、いろいろインデックス周りについて試してみることができる。

 

MS SQL(Transact-SQL):できる

SELECT * FROM hoge with (index (hoge_index2));

ref)http://msdn.microsoft.com/ja-jp/library/ms187731.aspx

 

こんなところかな。

|

« [メモ]サクラエディタでの改行コード除外 | トップページ | PostgreSQLユーザー(ロール)のoidを調べる »

コメント

拡張モジュールでpg_hint_planというものを利用することでORACLEライクなヒントが可能になります。
リンクは紹介エントリーです

投稿: かっしい | 2015.03.04 23:08

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 特定のインデックスを強制利用:

« [メモ]サクラエディタでの改行コード除外 | トップページ | PostgreSQLユーザー(ロール)のoidを調べる »