• 検索結果がありません。

PostgreSQL インサイド概要 SRA OSS, Inc. 日本支社石井達夫

N/A
N/A
Protected

Academic year: 2021

シェア "PostgreSQL インサイド概要 SRA OSS, Inc. 日本支社石井達夫"

Copied!
59
0
0

読み込み中.... (全文を見る)

全文

(1)

PostgreSQLインサイド概要

SRA OSS, Inc. 日本支社

石井達夫

(2)

アジェンダ

PostgreSQLの概要

PostgreSQLの構造概要

PostgreSQLの実装と内部構造

問い合わせ処理の流れ

(3)

3

(4)

PostgreSQLの概要:歴史

1977年スター

最初期の関係デー

タベースの実装

クローズドソース

PostgreSQLとの

コードの直接の関

連性なし

1986年スター

次世代関係データ

ベースシステム

フリーソフト

Object-Relational

Database

PostgreSQLの直

接の祖先

1994年スタート

SQL言語の実装

ANSI/Cによる

書き換え

25%の高速化

GNU makeの採用

178,976ステップ

1996年スタート

PostgreSQL Global

Development Group

によるインターネットベ

ースの開発

689,833ステップ

p14

(5)

5

PostgreSQLの概要:開発体制

Bruce Momjian Marc G. Fournier Tom Lane Jan Wieck Peter Einsentraut Josh Berkus Dave Page Major Developers ●20-30人 ●一部コミット権限あり Core members ●

ボランティアによる自主独立プロジェクト

サーバ類もボランティアの提供

メインソースは

cvs.postgresql.orgで管理,ア

プリケーション,関連プログラムは

pgfoundry.postgresql.orgでホスティング

(6)

PostgreSQLのLinux上のシェア

M y S Q L , 2 1 , 1 8 % D B 2 , 1 2 , 1 1 % S y m fo rw a re , 3 , 3 % H iR D B , 2 , 2 % P o w e rG re s , 1 , 1 % そ の 他 , 4 , 4 % O ra c le , 3 8 , 3 2 % P o s tg re S Q L , 3 3 , 2 9 % データは@ITより (2003年12月)

(7)

7

Linux市場でのオープンソース

データベースのシェア

0

20

40

60

80

P ostgreS Q L

M yS Q L

F ireB ird

その他

% データは2005年の矢野経済研究所のアンケート調査より

(8)

8

PostgreSQLの主な機能

SQL:2003の主要部分を実装

DDL, DML, Schema

副問い合わせ,トリガー,外部キー,ビュー

高度なトランザクション機能

2レベルのトランザクション分離レベル

トランザクションログによるリカバリ

アーカイブログ

(PITR: Point In Time Recovery)

セーブポイント

2相コミット

行ロック,テーブルロック

(9)

9

(10)

PostgreSQLの利用形態

C言語 lib p q PHP Perl Ruby Pyt hon JDBC ODBC TCP/ IP SQL DBアプリケーション Post greSQL DBエンジン ユーザ定義サーバサイ ドスクリプト ユーザ定義関数 ストアドプロシジャ • PL/ pgSQL • PL/ perl • PL/ pyt hon p93

(11)

11

PostgreSQLのプロセス構造

アプリケーション postmaster (PostgreSQL 管理デーモン) postgres (データベース エンジン) 接続 要求 起動 問い合わせ のやりとり データベース postgresql.conf (設定ファイル) pg_hba.conf (セキュリティポリシー ファイル) トランザクション ログ アーカイブログ background writer process statistics collector process p94

(12)

PostgreSQLのデータ構造

データベース スキーマ テーブルスペース テーブルスペース テーブル インデックス データベースクラスタ p96

(13)

13

データベースクラスタの構造

$PGDATA base 1 10792 10793 10287 10289 global pg_clog 10290 10292 pg_hba.conf pg_log Sun.log Mon.log pg_multixact pg_subtrans pg_tblspc pg_twphase pg_xlog postgresql.conf p98

(14)
(15)

15

サブシステムとその関係

frontend/ backend protocol パーサー プランナー エグゼキュータ テーブル インデックス MVCC Buffer Manager Storage Manager インデックステーブル Transaction Manager WALログ Memory Manager エラー処理

(16)

メモリーマネージャ

メモリーリークの防止

「メモリコンテキスト」

(memory context)

コンテキスト単位で一括メモリ解放

トランザクション単位のメモリコンテキスト

SQL文単位のメモリコンテキスト

メモリーアロケーション効率の向上

8KB単位でアロケーション

API

mallocの代わりにpalloc,freeの代わりにpfreeを

使用

MemoryContextAlloc()

(17)

17

エラー

/例外処理

long jumpを利用して例外処理を実装

エラー発生時にトランザクションをアボートし,メ

モリを解放する

コードの簡素化

エラー処理の集中管理

エラー番号

(SQL標準のエラー番号+PostgreSQL独

)

エラーメッセージ

gettextによるメッセージカタログ

メッセージ出力先の柔軟な切り替え

(18)

18

ストレージマネージャ

ストレージ層を抽象

実際には磁気ディス

クのみサポート

API

smgr_init

smgr_shutdown

smgr_close

smgr_create

API

smgr_unlink

smgr_extend

smgr_read

smgr_write

smgr_nblocks

smgr_truncate

smgr_immdesync

smgr_commit

smgr_abort

smgr_sync

storage/smgr/smgr.c

(19)

19

ストレージマネージャの位置づけ

ストレージマネージャ 磁気ディスクマネージャ バッファードファイル マネージャ 仮想ファイルマネージャ ソート処理など,一時 ファイルを使う処理 read/writeシステム コール エグゼキュータ

(20)

20

アクセスメソッドの種類

(1)

ヒープ

データが順に並ぶ単純な構造,テーブルに使用

B+tree

PostgreSQLの主要なインデックス,性能や効率が

優れている.スカラー値の範囲検索

Hash

値の一致だけを検索条件にする

効率が悪く,ログが記録されないので非推奨

R-tree

空間範囲検索

(「含むかどうか」など)

access/nbtree/README access/hash/README access/rtree access/heap

(21)

アクセスメソッドの種類

(2)

GiSTインデックス

汎用的かつ抽象化されたインデックス

consistent, union, compress, decompress, penalty,

picksplit, sameの7つの演算子クラス用メソッドを定義

すればどのようなデータもインデックス可能

応用例

B-tree,全文検索,木構造探索など

R-treeと同等の実装を含む

R-treeの実装は,ログが記録されないなどの問題あり

R-treeは今後サポートされない予定

access/gist/README

(22)

アクセスメソッドの体系

アクセスメソッド ヒープ トランザクション インデックス B+tree Hash GiST R-tree

(23)

23

ヒープの物理構造

空き領域

8192バイト 固定長のブロック (ページ) ヒープタプル ヒープタプル ラインポインター include/storage/bufpage.h テーブルファイル

(24)

ヒープタプルの構造

タプル ヘッダー ビットマップNULL OID 列1 列2 列n タプルID(ヒープタプルの物理的な位置) = ブロックID(32bit)+ブロック内のオフセット(16bit) 32TBまでの大きさのテーブルを扱うことができる(ブロックサイズが 標準の8KBの場合) include/access/htup.h 個々のタプルは「タプルID」(Tuple ID:TID)で識別される.タプルIDはOID (Object Identifier)と違って更新などで変化する.

(25)

25

タプルヘッダーの構造

t_xmin

4 行を挿入したトランザクションID

t_cmin

4 行を挿入したコマンドID

t_xmax

4 行を削除したトランザクションID

t_cmax/t_xvac

4 行を削除したコマンドIDまたは

VACUUMによって移動された行のバージョン

t_ctid

6 この行あるいは新しい行のTID(タプルID)

t_natts

2 列の数

t_infomask

2 フラグビット

t_hoff

1 行データへのオフセット

include/access/htup.h

(26)

インデックスタプルの構造

TID フラグ ビットマップNULL 列1 列2 列n

最大32列のマルチカラム インデックス作成可能

(27)

27

テーブルとインデックスの関係

TID フラグ ビットマップNULL 列1 列2 列n

テーブル

(28)

B+treeインデックスの構造

1 0 0 1 0 1 1 0 5 1 1 0 1 1 9 2 2 0 2 3 1 2 3 7 2 4 2 1 0 5 2 3 1 1 1 9 rootノード リーフノード インデックスノード インデックスタプル ページ ポインタ

(29)

29

MVCC(Multi Version

Concurrency Control)

行をバージョン管理する

更新中もその行を読み出せるのでトランザク

ションの並列実行性に優れている

実際には一つ前のバージョンを読み出す

Oracleで「読み取り一貫性」と呼ばれている

機能に相当

実装は全く異なる

どのトランザクションからも参照されなくなっ

た行は

VACUUMコマンドで削除

(30)

MVCCとタプルの可視性ルールの例

t_xmin

4 行を挿入したトランザクションID

t_cmin

4 行を挿入したコマンドID

t_xmax

4 行を削除したトランザクションID

t_cmax/t_xvac

4 行を削除したコマンドIDまたは

VACUUMによって移動された行のバージョン

t_ctid

6 この行あるいは新しい行のTID(タプルID)

同一トランザクション内では

自分よりもコマンド

IDが小さければ可視(ハロ

ウィーン問題の回避

)

異なるトランザクションでは

自分よりも

xminが小さければ可視(削除,更新され

た行を除く

)

utils/time/tqual.c

(31)

31

バッファキャッシュ管理

バックエンド プロセス バックエンドプロセス バックエンドプロセス 共有メモリ 上のdirtyバッファ ディスク上の ブロック カーネルバッファ storage/buffer/README

(32)

バッファキャッシュからディスクへ

の書き込みタイミング

dirtyバッファの再利用が必要になったとき

バックグラウンドライタープロセスが書き込ん

だとき

チェックポイントが発生したとき

このときに同期書き込み

(33)

33

システムカタログ

DBのメタ情報を管理

DBの一覧,テーブルの一覧...

DBローカルなシステムカタログとDB共有のシ

ステムカタログがある

DB共有システムカタログ

pg_authid, pg_tablespace, pg_shdepened,

pg_database

システムカタログを動的に作ることはできない

(34)

34

キャッシュマネージャ

ヒープメモリ上のローカルなキャッシュ

主にシステムカタログアクセスの高速化目的

キャッシュの種類

カタログキャッシュ

(システムカタログのキャッ

シュ

)

リレーションディスクリプタキャッシュ

(pg_class

のキャッシュ

)

型キャッシュ

キャッシュの無効化

共有メモリを使った「メッセージ」を各バックエン

ドに送る

utils/cache/

(35)

35

ロックマネージャ

3種類のロック

スピンロック

軽量ロック

重量ロック

重量ロックの機能

SQLのLOCK文

行ロック

,テーブルロックの管理

デッドロックの検出

waiting graphの利用

トランザクション終了時に自動的にロックを解放

storage/lmgr/README

(36)

36

トランザクション管理

トランザクションの競合の調停

ロック

,MVCCの利用

デッドロックの検出

waiting graphの利用

トランザクションとデータの可視性の管理

タプルヘッダーの

xmin, xmaxなどを利用

SERIALIZABLEとREAD COMMITTEDのサポート

MVCCとの兼ね合い

トランザクションログの管理

storage/access/transam

(37)

37

明示的なトランザクションと

暗黙的なトランザクション

セッション1 B E G IN U P D A T E C O M M IT U P D A T E 暗黙的 BEGIN 暗黙的COMMIT

(38)

フロントエンド・バックエンド

プロトコル

TCP/IP上のアプリケーションレベルのプロトコ

接続開始

,問い合わせの実行要求,結果の返却など

行データは基本的に文字列でやりとり

フロントエンド用

,バックエンド用のC言語

API(libpq)

libpqを使わずに独自実装も可能

JDBC, ODBC, pgpool

libpq

(39)

39

(40)

問い合わせ処理の流れ

問い合わせを受信 アナライズ処理 アナライザ リライト処理 リライタ プラン処理 プランナ(オプティマイ ザ) エグゼキュート処理 エグゼキュータ パース処理 パーサー 問い合わせ文字列

raw parse tree

query tree

rewrite後のquery tree

(41)

41

パース処理

文字列の

SQL文を解析してパースツリーを作成

この段階ではシステムカタログは参照しない

字句解析

flexを利用

数字は

[0-9],整数は数字が1個以上つらなったもの,

などの定義を列挙

構文解析

bisonを利用

SQL文の構造を再帰的に定義

paraser/gram.y

(42)

SELECT * FROM accounts

WHERE aid=100のパースツリー

NodeTag:RANGEVAR catalogname: NULL schemaname: NULL relname: “t1” InhOption: INH_NO istemp: false

(43)

43

問い合わせ処理の流れ

問い合わせを受信 アナライズ処理 アナライザ リライト処理 リライタ プラン処理 プランナ(オプティマイ ザ) エグゼキュート処理 エグゼキュータ パース処理 パーサー 問い合わせ文字列

raw parse tree

query tree

rewrite後のquery tree

(44)

アナライズ処理

パースツリーからクエリーツリーを作成

ステムカタログを参照してオブジェクトを決

,情報を補足

テーブル

OID

列名リスト

OID

オペレータ

OID

parser/analyze.c

(45)
(46)
(47)

47

問い合わせ処理の流れ

問い合わせを受信 アナライズ処理 アナライザ リライト処理 リライタ プラン処理 プランナ(オプティマイ ザ) エグゼキュート処理 エグゼキュータ パース処理 パーサー 問い合わせ文字列

raw parse tree

query tree

rewrite後のquery tree

(48)

48

リライト処理

クエリーツリーを一定のルールによって書き換

える

RULEシステムやVIEWの実装に利用

RULEの例

CREATE RULE t1rule1 AS ON INSERT TO t1

WHERE NEW.i < 100 DO INSTEAD INSERT

INTO t1 VALUES(NEW.i, NEW.j);

RULEのパースツリーもシステムカタログに格

RULEパースツリーを追加,置き換え

(49)

49

問い合わせ処理の流れ

問い合わせを受信 アナライズ処理 アナライザ リライト処理 リライタ プラン処理 プランナ(オプティマイ ザ) エグゼキュート処理 エグゼキュータ パース処理 パーサー 問い合わせ文字列

raw parse tree

query tree

rewrite後のquery tree

(50)

プランナ

一般に「オプティマイザ」と呼ばれている部分

「ルールベース」と「コストベース」オプティ

マイザ

クエリツリーからプランツリーを生成

組み込みルールを適用してクエリをより効率のよい

ものに書き換え

可能な実行方法

(path)を生成

その中から最適なものを選ぶ

選んだ

pathをプランに変換

optimizer/README

(51)

51

プランナによる書き換えの例

INをJOINに変換

foo OR TRUE -> TRUE

(52)

問い合わせ処理の流れ

問い合わせを受信 アナライズ処理 アナライザ リライト処理 リライタ プラン処理 プランナ(オプティマイ ザ) エグゼキュート処理 エグゼキュータ パース処理 パーサー 問い合わせ文字列

raw parse tree

query tree

rewrite後のquery tree

(53)

53

エグゼキュート処理

プランナが作成したプランを実行

固有の情報

スナップショット

実行中のトランザクションに関する情報

DestReceiver

実行結果の送信先

executor/README

(54)

SELECT count(*) FROM t1の

プランツリー

type: AGG startup_cost: 36.75 total_cost: 36.76 plan_rows: 1 plan_width: 0 target_list qual: leftree: righttree: initPlan: NodeTag: TARGETENTRY expr: resno: 1 resname: count resorigtbl: 0 resorigcol: 0 resjunk: false Plan TargetEntry NodeTag: AGGREF aggfnoid: 2147 aggtype: 20 target: agglevelsup: 0 aggstar: true aggdistinct: false AggRef NodeTag: CONST aggfnoid: 23 aggtype: 4 constvalue: constisnull: false constbyval: true Const type: SEQSCAN startup_cost: 0.00 total_cost: 31.40 plan_rows: 240 plan_width: 0 target_list qual: leftree: righttree: initPlan: Plan NodeTag: TARGETENTRY expr: resno: 1 resname: count resorigtbl: 0 resorigcol: 0 resjunk: false TargetEntry NodeTag: AGGREF varno: 1 varattno: 1 vartype: 23 vartypmod: -1 varnoold: 1 varoattno: 1 Var

(55)

55

エグゼキュータの実行

テーブル名から relfilenodeへの変換 SysCache pg_class RelCache heap access method Buffer Manager Storage Manager 磁気ディスク Manager

count(*) DestReceiver frontend/backend protocol

(56)

まとめ

PostgreSQLの概要

歴史

,開発体制,市場動向

機能

,構造

実装と内部構造

各サブシステムの役割と構造

問い合わせ処理の流れ

パーサー

,プランナ,リライト,プランナ,エグゼ

キュータ

(57)

57

参考文献

/URL

PostgreSQL完全攻略ガイド改訂第5版/石井達

/技術評論社/2006

WEB+DB PRESS「徒然PostgreSQL散策」

Vol.16「SQLをカスタマイズしよう」

● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol16_200-211.pdf

Vol.20「トランザクションログ」

● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol20_224-232.pdf

Vol.24「テーブルの構造とディスク容量の見積も

り」

● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol24_214-221.pdf ●

(58)

参考文献

/URL

WEB+DB PRESS「徒然PostgreSQL散策」

Vol.25「テーブルの構造とディスク容量の見積も

(2)」

● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol25.pdf ●

WEB+DB PRESS「PostgreSQL研究所」

Vol.27「パース処理とアナライズ処理」

● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol27.pdf

Vol.28「リライト処理」

● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol28.pdf

Vol.29「プラン処理(1)」

● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol29.pdf

(59)

59

参考文献

/URL

WEB+DB PRESS「PostgreSQL研究所」

Vol.30「プラン処理(2)」

● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol30.pdf

Vol.31「エグゼキュート処理」

● http://www2b.biglobe.ne.jp/~caco/webdb-pdfs/vol31.pdf

参照

関連したドキュメント

Freund, Dual gauge programs, with applications to quadratic programming and the minimum-norm problem,. Mathematical

In this paper, by using the integral bifurcation method 34–36, we mainly investigate some new exact solutions such as explicit solutions of Jacobian elliptic function type

(93) Thus a non-Noether symmetry of Toda chain not only leads to n functionally independent conservation laws in involution, but also essentially enriches the phase space geometry

To define the category of sets of which this type of sets is the type of objects requires choosing a second universe of types U 0 and an element u of U 0 such that U = El(u) where El

(注2) 営業利益 △36 △40 △3 -. 要約四半期 売上高 2,298 2,478

28 “Every [cognition] which grasps something totally dissimilar as being similar in fact has a similarity based on exclusion of others as its object, just as a cloth, although

(公財) 日本修学旅行協会 (公社) 日本青年会議所 (公社) 日本観光振興協会 (公社) 日本環境教育フォーラム

ご着任 室長 齊藤 秀男 氏 ご着任 岡崎 浩 氏 ご着任 堀 知子 氏 ご転任 前室長 中野 智晶 氏 ご転任 清水 法恵 氏 ご転任