[チューニング]式インデックス(関数インデックス)を使う

例えばdate型(つまりYYYY-MM-DDのような日付)のカラムを持つテーブルがあるとする。ちゃんとインデックスも張ろう。
create table test_table (id int4, dt date)
create index dt_index on test_table (dt)
このテーブルから「水曜日のレコードだけを抽出したい」とする場合、
select * from test_table where date_part('dow', dt) = 4
(注:dowとは曜日のことでゼロが日曜で6が土曜)
などと書くが、このときdt_indexインデックスは使用されずにSeq Scan(つまりフル走査)が走ってしまう。つまり遅い。なぜなら、dt_indexはYYYY-MM-DDのような日付の値のインデックスだから。

そこで関数インデックスの登場。
create index dt_dow_index on test_table (date_part('dow',dt))
とすると、date_part()という関数によって得られた0-6の値に対してインデックスを張ることができるので、先ほどのSELECTであればdt_dow_indexインデックスを使った高速な Index Scanをしてくれる。


参考サイト

http://neta.ywcafe.net/000960.html
スポンサーサイト

実行中のクエリを止める方法

select pg_cancel_backend(プロセスID);

プロセスIDは、
select * from pg_stat_activity
とかで、procpidのカラムを見る。

ロックの解除方法

SELECT pg_cancel_backend(プロセスID);
で解除を試みて、それでも駄目であれば
kill -9

プロセスIDは以下のどちらかで判断可能
pg_stat_activity.procid
pg_locks.pid

シーケンスの現在値を取得する

シーケンスの現在値を取得する。

select currval('シーケンス名')

ただし、これだと同じセッション内でnextvalしてないと取得出来ない。
こんなエラーが出る

ERROR: currval of sequence "afi_click2_tab_id_i_seq" is not yet defined in this session
SQLステート:55000


なので

select last_value from シーケンス名;

で取得する。

DBのインポート・エクスポート

■データベースごとエクスポート
pg_dump dbname > バックアップファイルパス(絶対パス)

■上記をインポート
psql dbname < バックアップファイルパス(絶対パス)

■テーブルごとのエクスポート
psqlでログイン後に
COPY tablename TO 'バックアップファイルパス(絶対パス)';

■上記をインポート
psqlでログイン後に
COPY tablename FROM 'バックアップファイルパス(絶対パス)';

プロフィール

U2K

Author:U2K
いろいろプログラムに関しての覚え書きをちょくちょくと書いていきます。

オススメ










オススメ

忍者AdMax

u2k on Twitter

最近の記事