textとvarchar(character varying)の違い

textとvarcharは共に文字型の型ですが、結論から言うと違いはありません

あえて言うならvarcharは文字数を指定できるので、データ量の見積もりが可能という程度。

 

ちなみに最大文字数は、varchar、textともには10,485,760バイト(=1GB)です。

※ SJIS、EUC_JP、UNICODEなら全角・半角関わらず1文字=1バイト

 

また、調べた中には、次のような使い方(考え方)もあるようでした。

『 ある文字数までのものはすべてvarchar(XX)で定義。それを超えるものはすべてtextで定義。』

例えば200文字まではvarcharで定義し、それ以上の文字は(文字数を定義する必要はないとして)

すべてtextとするといった取り決めをする。という方法が紹介されていました。

これは取り決めの場合の例ですが、ご参考まで。

 

 

関連記事(文字列操作)

文字列の結合、nullの結合

改行コードで結合、置換する

文字数のカウント(length)、バイト数を取得する

文字の切り取り(Left、Right、Substring)

検索文字位置の取得(strpos)

全角半角スペースを除去する(trim)

upper(小文字を大文字に変換する)

大文字小文字を変換する、区別せず比較する

文字を置換する、複数置換する(replace、translate)

前0埋め、後ろ0埋め(lpad、rpad)

Nullの時に別の値に置き換える

 

OID(Object Identifier:オブジェクト識別子)とは

いまさら感は否めないですが、OIDについて調べたことのメモです。

OIDとは、オブジェクト識別子といいPostgreSQLの内部で管理する値です。

 

特徴をまとめると次の通り

・ データベース、テーブル、ロール、関数、操作、データ型などに割り振られる

※ テーブル作成時の『WITH OIDS』はPostgreSQL12で廃止

・ 0は使わない(0は無効な値の扱い)。符号なし4バイト(最大値:4,294,967,295)の値をとる

・ OIDは一周して同じ値をとる場合があるため、一意であると仮定してはならない

・ 主キーを持たないテーブル、重複行があるテーブルなどに有効

 

 

OIDを取得するSQL

各OIDを取得するSQLです。

--データベースのoidを取得する
select datid,datname from pg_stat_database;

--テーブルのoidを取得する
select relid,relname from pg_stat_all_tables;

--ユーザー(ロール)のoidを取得する
select oid,* from pg_roles;

PostgreSQLのサービス開始、停止、再起動コマンド

PostgreSQLのサービス停止・再起動コマンドを紹介します。

大きく2つの方法(① pg_ctlを使用する、② net start / stopを使用する)があり、それぞれについて説明します。②はWindowsの機能になるため、安全に停止するなら①のpg_ctlの場合がよいかと。

 

あわせて読みたい

Linux(CentOS)の場合はこちらを参照

https://postgresweb.com/postgresql13-service-start

 

 

 

方法①:pg_ctlを使用

pg_ctlを使用しサービスの開始、停止、再起動を行うコマンド例です。

--PostgreSQLサービスの開始(-Dでdataフォルダを指定する)
pg_ctl.exe start -D "C:\Program Files\PostgreSQL\data"

--PostgreSQLサービスの停止
pg_ctl.exe stop -D "C:\Program Files\PostgreSQL\data"
--停止モードは3種類あり(詳細は下記参照)
pg_ctl.exe stop -m smart -D 省略     
pg_ctl.exe stop -m fast -D 省略
pg_ctl.exe stop -m immediate -D 省略

--PostgreSQLサービスの再起動
pg_ctl.exe reload -D "C:\Program Files\PostgreSQL\data"

--PostgreSQLサービスの状態を確認
pg_ctl.exe status -D "C:\Program Files\PostgreSQL\data"

 

停止方法(smart , fast , immediate)について

「ーm」で指定できる停止方法には、smart , fast , immediateの3パターンがあります。

・smart:すべてのクライアントが切断するのを待ってからデータベースを停止

・fast:実行中のトランザクションをすべてロールバック+クライアント接続を強制的切断し、停止

・immediate は、サーバプロセスを即座に停止(DB再起動時にリカバリ処理が実行)

尚、デフォルトはfastになっています。(PostgreSQL9.5以降)

 

 

方法②:net start / stopを使用

net start / net stopを使用し、PostgreSQLのサービスを開始、終了、再起動する例です。

※ コマンドプロンプト(もしくはPowerShell)を管理者権限で実行して下さい。

管理者権限のやり方:コマンドプロンプトを右クリック > その他 > 管理者として実行

--PostgreSQLサービスの開始
net start postgresql-XXXXX
net start postgresql-x64-12  --例:PostgreSQL12の場合

--PostgreSQLサービスの停止
net stop postgresql-XXXXX
net stop postgresql-x64-12   --例:PostgreSQL12の場合

--PostgreSQLサービスを再起動する(停止 → 起動の順番に実行する)
net stop postgresql-x64-12   --例:PostgreSQL12の場合
net start postgresql-x64-12

 

 

方法②の補足:サービス名の調べ方

上で紹介した 『postgresql-x64-12』の箇所はサービス名を指定しています。

サービス名は、次の手順で確認します。

 

① エクスプローラー上のPCを右クリック > 管理をクリック

 

② 左赤枠内のサービスアプリケーション > サービスから

「postgresql-XXXX」で始まるサービス名を右クリック > プロパティをクリックします。

 

③ 左赤枠内の表示されているものがサービス名です。

この場合は、「postgresql-x64-12」がサービス名だとわかります。

 

 

各バージョンのサポート期限

各バージョンのサポート期限(EOL=End Of Life)をまとめました。

期限は初期リリースから5年です。

 

※ その5年後にはメジャー版は修正を含む最後のマイナーリリースを1回だけ行い

その時点で廃版(EOL)とみなされサポートされなくなります。最新情報はこちら

 

バージョン 初期リリース サポート終了期限
16 2023年9月 2028年11月
15 2022年10月 2027年11月
14 2021年09月 2026年09月
13 2020年09月 2025年11月
12 2019年10月 2024年11月
11 2018年10月 2023年11月
10 2017年10月 2022年11月
9.6 2016年09月 2021年11月
9.5 2016年01月 2021年02月
9.4 2014年12月 2020年02月
9.3 2013年09月 2018年11月
9.2 2012年09月 2017年11月
9.1 2011年09月 2016年10月
9.0 2010年09月 2015年10月

 

 

各バージョンのインストール方法

PostgreSQL13のインストール

PostgreSQL12のインストール

PostgreSQL11のインストール

インストールせずにPostgreSQLを使用する(ポータブル版)

 

 

PostgreSQLのリリース頻度

約1年に1度、新機能を含む新しいメジャーバージョンのリリースと、

少なくとも3ヶ月に一度のマイナーバージョンアップが行われます。

 

メジャーバージョンアップでは、仕様の追加・変更、バグ修正とセキュリティ修正が行われ、

マイナーバージョンアップでは主にバグ修正が行われます。

 

※ メジャーバージョンアップは、基本的に互換性がないため注意

※ 重要なバグや、重要なセキュリティ修正の場合は例外あり

※ マイナーリリースのスケジュールについては、こちらのロードマップ(英語)をご覧下さい。

 

 

 

PostgreSQLのバージョン表記

PostgreSQLのバージョン表記は次のようになっています。

 

PostgreSQL 10以降のバージョン

メジャーバージョンがあがると、バージョンの最初の数字が増えます。

例:PostgreSQL10、PosgreSQL11

 

・マイナーバージョンは、2番目の数値で表記されます。

例:PostgreSQL12.3、PostgreSQL12.4

 

PostgreSQL 10より前のバージョン(9.6以前)

・メジャーバージョンは、1番目または2番目の数値が増えます。

例:PostgreSQL9.5、PosgreSQL9.6

 

・マイナーバージョンは、3番目の数値で表記されます。

例:PostgreSQL9.5.3、PostgreSQL9.5.4

 

 

 

メジャーバージョンごとに追加された主な機能

過去のバージョン含み、メジャーバージョンごとに追加された主な機能一覧を引用させてもらいました。

表1.1 メジャーバージョンごとに追加された主な機能

出典:PostgreSQLとは? 初めてデータベースに触る人のための『PostgreSQL徹底入門 第4版』から紹介(CodeZine)https://codezine.jp/article/detail/11753

 

説明

ここでは、pgAdminのマスターパスワードを変更する方法を紹介します。

 

あわせて読みたい

postgresユーザーのパスワードを忘れてしまった場合の手順はこちらです。

https://postgresweb.com/forget-the-password-for-postgres-user

 

 

そもそもマスターパスワードっていつ入力?

私だけかもしれないですがマスターパスワードっていつ設定したっけ?と思いましたが、pgAdminの初回起動時に設定していました。このマスターパスワードは、PostgreSQLインストール時のパスワードとは別の扱いなので注意して下さい。

 

 

パスワード変更方法

① パスワード変更はpgAdminで行います。

 

 

② pgAdminを起動します。左下にある「マスタパスワードを初期化」ボタンをクリックします。

 

 

③ このメッセージは「Yes」で次へ

 

 

④ 新しいパスワードを入力しOKボタンを押します。

 

 

⑤ PostgreSQLの再起動が必要になるので、下のコマンドで「サービスの停止」→「サービスの開始」を行います(わからない場合はコンピュータ自体を再起動)。

# PostgreSQL12の場合のreload例
pg_ctl -D "C:\Program Files\PostgreSQL\data" stop
pg_ctl -D "C:\Program Files\PostgreSQL\data" start

チートシート作りました

PostgreSQLの構文のチートシートを作りましたので使ってみてください。

※イメージ図

 

 

PostgreSQLの構文まとめを書いています

入門~経験者まで「基本構文・こんな時どう書くんだっけ?」のまとめ

 

エラーについて

データベース削除時等に『database "XXXXX" is being accessed by other users

DETAIL:There is other session using the datanase』のエラーが発生した場合の対応方法です。

 

 

 

対応方法

そもそも原因は、そのDBに他からの接続があるため削除できないというメッセージです。

DBへの接続を強制切断するコマンドを実行すれば、DBを削除できるようになります。

(強制切断コマンドは切断していいかを確認の上、実行するようにしてください。)

-- DBの接続を強制切断する
select pg_terminate_backend(pid) from pg_stat_activity where datname = 'データベース名';

個別に、接続中のセッションを確認し接続するにはここを参照してください。

 

リストア(psql、pg_restor)の方法

このページではバックアップしたファイルをDBとして復元(リストア)する方法を解説します。

 

バックアップの方法

バックアップを行う方法についてはこちらで解説していますので参考にしていただけると幸いです。

 

 

 

リストア方法

リストアを行うためには、「psql」コマンドまたは、「pg_restore」コマンドを使用します。2つのコマンドはバックアップをした方法によりどちらを使うかが変わってきます。format=p(SQL文のテキストファイル)でバックアップした場合は「psql」、それ以外(format=c , format=t , format=d)は「pg_restore」を使用します。ここからはそれぞれのコマンド例を紹介します。

 

① format=p(SQL文のテキストファイル)のバックアップとリストア

1つ目は、format=pでバックアップをした場合のリストアコマンドです。ここだけpsqlを使用します。

# バックアップ
# pg_dump -U ユーザー名 --format=p --file=バックアップファイルパス 対象のDB
pg_dump -U postgres --format=p --file=C:\script\test1.sql testdb1

# リストア
createdb -U postgres newdb  # リストア先のDBを先に作成する
psql -h ホスト名 -U ユーザー名 -d リストア先のDB -f .sqlファイルのパス
psql -h localhost -U postgres -d newdb -f C:\script\test1.sql

オプションについて

-U … コマンドを実行するユーザー名を指定。

-d … データベース名を指定。

-h … ホスト名を指定。192.16.xx.yy等設定可能。localhostは省略可。

 

 

② format=c(カスタム形式)のバックアップとリストア

format=cでバックアップをした場合のリストアコマンドです。

# バックアップ
pg_dump -U postgres --format=c --file=C:\script\test2.custom testdb2

# リストア
createdb -U postgres newdb2  # リストア先のDBを先に作成する
pg_restore -h localhost -U postgres -d newdb2 C:\script\test2.custom

 

 

③ format=t(tar形式)のバックアップとリストア

format=tでバックアップをした場合のリストアコマンドです。

# バックアップ
pg_dump -U postgres --format=t --file=C:\script\test3.tar testdb3

# リストア
createdb -h localhost -U postgres newdb3  # リストア先のDBを先に作成する
pg_restore -h localhost -U postgres -d newdb3 C:\script\test3.tar

 

 

④ format=d(ディレクトリ形式)のバックアップとリストア

format=dでバックアップをした場合のリストアコマンドです。

# バックアップ
pg_dump -U postgres --format=d --file=C:\script\test4 testdb4

# リストア
createdb -h localhost -U postgres newdb4  # リストア先のDBを先に作成する
pg_restore -h localhost -U postgres -d newdb4 C:\script\test4

 

説明

pg_dump実行時に、パスワードを聞いてくるのをスキップ(省略する)方法を紹介します。

 

 

方法

方法は、pg_dumpの前に「set PGPASSWORD=パスワード」の1行を入れるだけです。

※例ではパスワードを「xxxxx」としていますが、お使いのパスワードに変更し実行して下さい。

-- pg_dumpの前にこの1行を入れて実行するだけです。
set PGPASSWORD=xxxxx

-- ここの2行はバックアップコマンド
cd C:\Program Files\PostgreSQL\bin
pg_dump -U ユーザー名 -f バックアップファイル名 -Fc データベース名

※ 「バックアップファイル名」はフルパス

 

 

 

使用例

-- pg_dumpの前にこの1行を入れます。
set PGPASSWORD=userpassword

-- ここの2行はバックアップコマンド
cd C:\Program Files\PostgreSQL\bin
pg_dump -U postgres -f C:\Test\testdb.backup -Fc shooldb

 

 

pg_dumpを詳しく解説

こちらの記事でpg_dumpについて詳しく解説しています。

一読してもらえればうれしいです。

 

Explainとは

Explainは推定された実行計画を表示するコマンドです。

『実行計画=最適なのか』を確認する際に使用します。

-- 実行方法:select文の前に「explain」を加えるだけでOK
explain select * from XXXXX;

 

 

ExplainとExplain Analyze

「Explain」には、「Explain」と「Explain Analyze」という二つの書き方があります。

Explain AnalyzeもExplainと同様、SELECT文の先頭に付けて実行します。

 

二つの違いは、

Explain              … 推定された実行計画を表示する

Explain Analyze … 推定ではなく、一度実行してみた結果を表示する

--推定された実行計画を表示する
explain select * from XXXXX;         

--推定ではなく、一度実行した結果を表示する
explain analyze select * from XXXXX; 

 

 

costの見方

実際にexplainを実行すると、「cost」という値が返ってきます。

cost=A..B
-- A = 初期コスト(select文に対して最初の行を返すコスト)
-- B = トータルコスト(最後の行を返すコスト)

重要なのはトータルコストのほうです。また、costの値は相対値であり、単位はありません。

(シーケンシャルで1ページを読み込む場合のコストを1.0として示されます)

 

 

cost以外の値(rows、width)

cost以外の値、rows、widthは次のとおり。(widthはそれほど重要ではない)

cost=A..B rows=1000 width=4
-- rows = select文の結果として推定された行数を表示(あってない場合も全然ある)
-- width = 取得される行の平均サイズ(integer:4 , boolean:1 ・・・)

 

rowsの値が実際とかけ離れている場合、vacuum、analyzeし統計情報を更新を検討します。

vacuum、analyzeの説明はこちらに記載しています。

あわせて読みたい

https://postgresweb.com/post-5194

 

 

 

actual time

explain analyzeを実行した時には、実際の実行時間が返ってきます。

actual time=A..B rows=800 loops=1
-- time = 実際の実行時間(ミリ秒)
-- loops = 処理の繰り返し回数

 

 

○○ Scanの違い

返ってきた結果で○○ Scanと書いてあるところの説明です。

・Seq Scan                  … 全行スキャンしている(インデックスを使用していない)

・Index Scan           … インデックスを使用している

・Bitmap Scan        … (例えば複数の)インデックスを効率的に使用してスキャンしている

・Index Only Scan … テーブルのアクセスを省略して検索。非常に高速

※ Index Only Scanは、テーブルに直接アクセスせずVisibility Mapから取得する

 

 

Sort

Sort Methodの説明です。

・quick sort Memory   … メモリ上のみで処理ができるため早い

・external sort dsik   … メモリ+ディスクへのアクセスも発生するため時間がかかる

 

 

Nested loop , Merge Join , Hash Joinについて

テーブル同士の結合について書いています。

・Nested loop … 全行×全行のイメージ

・Merge Join … 結合するテーブルをそれぞれソートした後に結合する。走査回数が減る

・Hash Join … あらかじめテーブルのハッシュ表を作り、結合するテーブルと突き合わせる

※ Hash Joinのハッシュ表はメモリに収めておく。

 

比較すると

・Nested loop … データが小さい場合に有効

・Merge Join  … データが多い場合に有効

・Hash Join    … メモリーが十分にある場合に有効

 

 

参考・引用

次の資料を参考にさせていただきました。

『Slide Share , https://www.slideshare.net/MikiShimogai/sql-42453213,SQLチューニング入門 入門編,

PostgreSQLカンファレンス2014 2014年12月5日, TIS株式会社下雅意美紀』