PostgreSQLがSQLを実行する流れは、通常次のようになる。
このうち1.と2.の処理にかなりのコストがかかるため、同じようなSQLを繰り返し実行する場合効率が悪い。
この場合、実行計画自体をあらかじめ作成しておけば効率がよい。
実行計画作成がPREPARE、その実行がEXECUTEである。
実行計画は引数をとることができる。
注)
実行計画はDEALLOCATEで削除する。
また、実行計画はセッション(ログインしている間)のみ有効。
・PREPARE
PREPARE 実行計画名(引数の型の並び) AS SQL文;
・DEALLOCATE
DEALLOCATE 実行計画名;
・EXECUTE
EXECUTE 実行計画名(実引数の並び);
次のSQLをファイルとして作成。(prepare101.sql)
上記のSQLを実行し、実行計画自体を定義する。
oddtbs=> \i prepare101.sql
...
実行計画を実行。
oddtbs=> \t Showing only tuples. oddtbs=> execute pre01(1, 2, 3); 片山千春 oddtbs=> execute pre01(3, 2, 1); 石橋直晃 oddtbs=> execute pre01(2, 2, 2); 正守貴世 oddtbs=> \t Tuples only is off.
SELECT文の結果を利用してテーブルを作成することができる。
CREATE TABLE テーブル名[(列名の並び)] AS SELECT文;
列名の並びが指定されない場合は、SELECTの結果の列名がそのまま使用される。
準備
oddtbs=> \i emp_create042.sql ... oddtbs=> \i emp_insert011.sql ... oddtbs=> select * from emp; code | name | gender | age | tel --------+----------+--------+-----+--------- 564001 | 鈴木義男 | 1 | 58 | 11-1111 564002 | 斎藤洋子 | 2 | 44 | 22-2222 564003 | 山田美樹 | 2 | 33 | 33-3333 564004 | 田中秀明 | 1 | 35 | 44-4444 564005 | 佐藤研一 | 1 | 30 | 55-5555 564006 | 相原佳子 | 2 | 28 | 66-6666 564007 | 小林律子 | 2 | 33 | 77-7777 564008 | 吉田隆士 | 1 | 24 | 88-8888 (8 rows)
ログイン画面から実行。
oddtbs=> create table tmp1 as select code, name, tel from emp; SELECT oddtbs=> select * from tmp1; code | name | tel --------+----------+--------- 564001 | 鈴木義男 | 11-1111 564002 | 斎藤洋子 | 22-2222 564003 | 山田美樹 | 33-3333 564004 | 田中秀明 | 44-4444 564005 | 佐藤研一 | 55-5555 564006 | 相原佳子 | 66-6666 564007 | 小林律子 | 77-7777 564008 | 吉田隆士 | 88-8888 (8 rows) oddtbs=> create table tmp2(c1, c2, c3) as select * from emp; SELECT oddtbs=> select * from tmp2; c1 | c2 | c3 | age | tel --------+----------+----+-----+--------- 564001 | 鈴木義男 | 1 | 58 | 11-1111 564002 | 斎藤洋子 | 2 | 44 | 22-2222 564003 | 山田美樹 | 2 | 33 | 33-3333 564004 | 田中秀明 | 1 | 35 | 44-4444 564005 | 佐藤研一 | 1 | 30 | 55-5555 564006 | 相原佳子 | 2 | 28 | 66-6666 564007 | 小林律子 | 2 | 33 | 77-7777 564008 | 吉田隆士 | 1 | 24 | 88-8888 (8 rows)
テーブル作成時にTEMPというキーワードを指定すると一時テーブルとして作成される。
一時テーブルとはセッション(ログインしている間)でのみ有効なテーブルである。
CREATE [TEMP] TABLE テーブル名 ...;
ログイン画面から実行。
oddtbs=> create temp table tmp3 as select * from emp; SELECT oddtbs=> select * from tmp3; code | name | gender | age | tel --------+----------+--------+-----+--------- 564001 | 鈴木義男 | 1 | 58 | 11-1111 564002 | 斎藤洋子 | 2 | 44 | 22-2222 564003 | 山田美樹 | 2 | 33 | 33-3333 564004 | 田中秀明 | 1 | 35 | 44-4444 564005 | 佐藤研一 | 1 | 30 | 55-5555 564006 | 相原佳子 | 2 | 28 | 66-6666 564007 | 小林律子 | 2 | 33 | 77-7777 564008 | 吉田隆士 | 1 | 24 | 88-8888 (8 rows)
一度ログアウトし、再度ログインする。
ログイン画面から実行。
oddtbs=> select * from tmp3;
ERROR: relation "tmp3" does not exist
※ tmp3は存在していない。