« java.net.UnknownHostException! | トップページ | バーコードに含まれてた制御コードを無視する »

2014.07.09

不要なインデックスは消しましょう

しばらく空いてしまった。
こんな零細ブログでも、更新が滞るとてき面にPVが減っていくというのはなかなか興味深い事象である。

今回はPostgreSQLの運用周りのちょっとしたメモ。

インデックスをパフォーマンス改善のためにいろいろと付与してみる、ということはあるだろう。
また開発時にあるSQLの走査最適化のために付与してみるのもよくある。
ただ、開発段階で有効だったインデックスが運用後ずっと有効とは限らないし、下手をすると『下手な鉄砲」方式で付与された、役に立っていないインデックスが放置され、update処理の性能悪化とDBのガベージ肥大化に貢献しているケース、というのも存在しえる話である。

そこで今回は利用頻度の低いインデックスを抽出してみたい。

SELECT
indexrelid
, relname
, indexrelname
, psui.idx_scan
, (psut.seq_scan + psut.idx_scan) as total_scan
, round(psui.idx_scan / (psut.seq_scan + psut.idx_scan)::numeric * 100,2) AS idx_scan_ratio
FROM pg_stat_user_indexes AS psui
INNER JOIN pg_stat_user_tables AS psut USING(relname,schemaname)
WHERE psut.seq_scan + psut.idx_scan > 0
ORDER BY idx_scan_ratio
;
こんな感じでいかがだろうか?
これで利用頻度の低いインデックスが抽出できる。
もちろん、33%の利用率でも、同じように33%くらいの利用率のインデックスがほかに2つあるのならば、そのテーブルのインデックス効率は高いと言ってもいいだろう。

で細かいTips。
round関数を使って、比率を見やすく表示しているが、round関数の引数は(v numeric型,s int)なのでpsui.idx_scan / (psut.seq_scan + psut.idx_scan)::numericでないとエラーになる。
::realで型指定をしていて、

HINT: No function matches the given name and argument types. You might need to add explicit type casts.
というエラーが出続けたのは内緒である。

また型指定をしていないと、int / (int + int)になるため、戻りがintで、roundすると常に0になってしまうので、そこも注意だw

|

« java.net.UnknownHostException! | トップページ | バーコードに含まれてた制御コードを無視する »

コメント

コメントを書く



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




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/59948181

この記事へのトラックバック一覧です: 不要なインデックスは消しましょう:

« java.net.UnknownHostException! | トップページ | バーコードに含まれてた制御コードを無視する »