その他

実行計画

PostgreSQLがSQLを実行する流れは、通常次のようになる。

  1. SQLの構文チェック・解析
  2. 実行計画の作成
  3. 実行計画を実行

このうち1.と2.の処理にかなりのコストがかかるため、同じようなSQLを繰り返し実行する場合効率が悪い。
この場合、実行計画自体をあらかじめ作成しておけば効率がよい。
実行計画作成がPREPARE、その実行がEXECUTEである。
実行計画は引数をとることができる。
注)
実行計画はDEALLOCATEで削除する。
また、実行計画はセッション(ログインしている間)のみ有効。

・PREPARE

PREPARE 実行計画名(引数の型の並び) AS SQL文;

・DEALLOCATE

DEALLOCATE 実行計画名;

・EXECUTE

EXECUTE 実行計画名(実引数の並び);
  1. 次のSQLをファイルとして作成。(prepare101.sql)

    
    
  2. 上記のSQLを実行し、実行計画自体を定義する。

    oddtbs=> \i prepare101.sql
    ...
    
  3. 実行計画を実行。

    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.
    

CREATE TABLE ... AS

SELECT文の結果を利用してテーブルを作成することができる。

CREATE TABLE テーブル名[(列名の並び)] AS SELECT文;

列名の並びが指定されない場合は、SELECTの結果の列名がそのまま使用される。

  1. 準備

    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)
    
  2. ログイン画面から実行。

    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 テーブル名 ...;
  1. ログイン画面から実行。

    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)
    
  2. 一度ログアウトし、再度ログインする。

  3. ログイン画面から実行。

    oddtbs=> select * from tmp3;
    ERROR:  relation "tmp3" does not exist
    ※ tmp3は存在していない。