29回勉強会資料「PostgreSQLのリカバリ超入門」
See also http://www.interdb.jp/pgsql (Coming soon!)
初心者向け。PostgreSQLのWAL、CHECKPOINT、 オンラインバックアップの仕組み解説。
これを見たら、次は→ http://www.slideshare.net/satock/29shikumi-backup
Introduction to InfiniBand technology and its usage on Debian platform. Includes various examples of NAS/SAN over IB configuration (NFSoRDMA, SRP, and other standard IP and IPoIB based setups).
27. Copyright ? 2014 K.K.Ashisuto All Rights Reserved. 27
実行計画の確認
● EXPLAIN または EXPLAIN ANALYZE でSQLの実行計画を取得
●
計画ツリーの階層が深いものがから順に実行されている
– 通常、各テーブルへのアクセスから始まる
●
EXPLAIN ANALYZEの場合、実際にSQLが実行される
– 所要時間、取得した行数、ループ回数が記録される
– SQLが実行されてしまうため、更新処理の場合は必ずBEGINでトランザクションを開始してから実施する
EXPLAIN
EXPLAIN
postgres=# EXPLAIN SELECT b.logno,e.empname,b.log_text FROM log_master m,log_body b,emp e
WHERE b.logno=m.logno AND e.empno=m.empno AND m.status = 'WI';
QUERY PLAN
------------------------------------------------------------------------------------------
Hash Join (cost=79.00..1754.21 rows=10000 width=66)
Hash Cond: (m.empno = e.empno)
-> Merge Join (cost=0.00..1525.21 rows=10000 width=24)
Merge Cond: (m.logno = b.logno)
-> Index Scan using log_master_pkey on log_master m (cost=0.00..6907.33 rows=31373 width=8)
Filter: (status = 'WI'::bpchar)
-> Index Scan using log_body_pkey on log_body b (cost=0.00..707.27 rows=10000 width=20)
-> Hash (cost=54.00..54.00 rows=2000 width=50)
-> Seq Scan on emp e (cost=0.00..54.00 rows=2000 width=50)
計画ツリー
計画タイプ(プラン) コストの推定値 推定行数や列幅
28. Copyright ? 2014 K.K.Ashisuto All Rights Reserved. 28
PostgreSQLの計画タイプ
● 計画タイプを確認し、意図した方法が選択されているかを調査
● 必要なIndexが作成されているか
● 意図したプランが選択されるSQLを書いているか
計画タイプ 内容
Seq Scan 全表スキャン:表内の大量の行にアクセスする場合に有効
Index Scan 索引スキャン:表内のごく一部の行にのみアクセスする場合に有効
Index Only Scan 索引のリーフブロックのみにアクセスするスキャン(表へのアクセスをスキップ)
Bitmap Index Scan ビットマップ使用した索引スキャン
Bitmap Heap Scan ビットマップスキャンで表にアクセス
Function Scan ファンクションの実行結果に対するスキャン
Nested Loop ネステッドループ結合:片方の表のうち、ごく少数の結果を条件として他方の表からデータを取得
Merge Join マージ結合:両方の表の行数が多い場合、ソートし、上から順に値を比較して該当行を抽出
Hash Join ハッシュ結合:表の行数に差があり、かつ小さい表の重複が少ない場合に有効
table access
join
29. Copyright ? 2014 K.K.Ashisuto All Rights Reserved. 29
対策:索引が使われないパターン
● 演算/関数処理
● データ型の暗黙変換
● NOT条件
など、SQLの書き方で索引が
使われないパターンを紹介
30. Copyright ? 2014 K.K.Ashisuto All Rights Reserved. 30
対策:索引を活用してソートを省略
● ソート
● 集計
など、索引があることで表への
アクセスをスキップして処理を
行えるパターンを紹介
31. Copyright ? 2014 K.K.Ashisuto All Rights Reserved. 31
対策:結合
● PostgreSQLは結合のプランが複数あり、複雑な結合にも強い
●
それでも意図した結合にならない場合、enable_*join パラメータでプランの候補を検討
●
デフォルトでは、FORM句に8個のテーブル、JOINも8テーブルまでプランを評価
例えば
テーブルA,B,Cにアクセスするクエリで、A,Bへのアクセスは、事前に定義したビューを使っている。
?A,Bを結合したビューとしてデータをとってきたあと、Cと突き合わせて結果を得るか
?ビューの元はテーブルA,Bなので、ABCを柔軟に組み合わせ効率の良いプランを探すか
というプランナの戦略を指定(本例はテーブル3個だが、デフォルトでは8個を超えた時点でプランナがあまり考えなくなる)
postgres=# SET enable_hashjoin TO off;
postgres=# SELECT ??????? FROM A JOIN B ON ???????;
/* 意図した結合方式を使わせたい場合、セッ
ション内でSETコマンドでパラメータの変更を
行う */
postgres=# SET from_collapse_limit TO 16;
postgres=# SET join_collapse_limit TO 16;
postgres=# SELECT ??????? FROM A JOIN B ON ???????;
/* プラン生成に時間がかかるが、効率的な結
合を行うようになり、実行時間が劇的に改善
される可能性がある */
32. Copyright ? 2014 K.K.Ashisuto All Rights Reserved. 32
高速化を期待されるが注意が必要なもの
● Materiarized View
●
PostgreSQL9.3でマテリアライズド?ビューが使用可能となった
●
実体をもったビューで、結合や集計結果を保存しておくことで高速にアクセスできる
●
ただし、現在は以下の制約があり、今後の機能向上に期待
– リフレッシュ時に元のテーブルに対して非常に強いロックを取得
– 自動リフレッシュや差分(高速)リフレッシュがなく、手動の完全リフレッシュのみ
● Index Only Scan
●
PostgreSQL9.2でIndex Only Scanが使用可能となった
●
インデックスで必要なデータが得られる場合、テーブルへのアクセスをスキップする機能
●
ただし、対象のテーブルがVACUUM直後(VACUUM後に更新されていない)ことが
選択される条件であり、使用する場合は注意が必要
33. Copyright ? 2014 K.K.Ashisuto All Rights Reserved. 33
PostgreSQL9.4betaの話