エンジニア的な技術的なブログ

webエンジニアの開発の知見を書きます。PHP、javascript、postgres、mysql、あと多少のインフラ周りとか。

postgresで強制的にインデックスを効かせるSQLがあるぜ。

 

そこそこ大きなテーブルの検索処理のパフォーマンスチューニングをやっていてぶつかった課題。

 

SQLだけで、ポスグレのオプティマイザに判断させずに、使えるインデックスがある場合には必ず使わせることができます。

 

というおまじないがこれ

 

set local enable_seqscan=false;

 

これをやれば同一のトランザクション内では、使えるインデックスがあれば

必ず使ってくれます。

 

がしかし、

どのインデックスを使うかはオプティマイザに委ねるしかありません(ー ー;)

 

ちなみに戻す時は

 

set local enable_seqscan=default;

 

※localは無くても使えるけど、そのSQLだけに効果を出したいなら、

指定しといたほうがいいらしい。

 

mysqlだとたしかuse index とかでどのインデックス使うかも指定できたような気がするんだけど、ポスグレはできないらしい

 

イケてねぇなー。設計思想が違うらしいから、ポスグレは難しいのなぁ... ?

 

あと、dbの設定状況を確認するにはこう。

show enable_seqscan; 

 

 

DBサーバの設定をいじれない環境で、インデックスが効かなくてどうにも困った状況が起きていましたので、色々調べてやってみたらそこそこ使えそう。

 

今回、全文検索のパフォチューだったんですけれども、DBサーバの設定を触れないせいで、N-gramとかを使おうとしてたのに使えなかった。

 

 

ニフクラのRDBというのを使ったんだけど、もう使いたくねぇ

レプリケーションとか簡単でいいけどさ、いざというときにDBの設定を操作できないのは本当こまるし。