スキップしてメイン コンテンツに移動

”似て非なるものなれど似てるとこあり”と読みました

PostgreSQLを利用するにあたって、
MWとして見たときに必要なことが記さされていると感じました。

私自身はSQLServerをずっと利用してきて、
PostgreSQLを触り始めたところなので、 
知識を移行するには非常に有用な本でした。

アプリケーションエンジニアがDBについて考え出したときに、
読むとちょうどいいぐらいの本な気がしました。

(以下抜粋。○:完全抜粋、●:簡略抜粋)
●text型は最大で1GBまで格納可能です。
 char型は末尾を空白で埋めるなら意味がありますが、それ以外の意味はありません。
 varcharはtext型とほぼ同じですが、格納時のサイズ上限チェックが行われるため、
 ごくわずにtext型よりも遅くなります。(通常、無視できる程度の差です)。(P.80)

○暗黙のB-treeインデックスは主キーだけでなく、
 一意性制約が定義された列にも作成されます(P.90)

●TOAST(The Oversized-Attribute Storage Techinique)(P.94-95)
 行のサイズが2KBを超えると、業のサイズが2KBより小さくなるまで、
 列の値を圧縮したり、行内とは別の領域に列の値を移動しようとします。

●ページ数の計算方法(P.102-103)
 RN:想定レコード数
 FF:FILLFACTOR
 TS:行の平均サイズ
 PS:ページサイズ(8192kb固定)
 PH:ページヘッダー(24kb固定)
 ページ数=RN / ((PS * FF - PH) / TS)

●インデックスアクセスは、シーケンシャルアクセスと比較すると、
 ファイル先頭から各ページを読む必要はないため、
 テーブルサイズによる性能への影響は低くなりますが、
 代わりにランダムアクセスが頻発することになります。(P.105)

●HOT(Heap On Tupple)(P.108)
 ・UPDATE時のインデックスエントリの追加処理をスキップする
 ・VACUUM処理を待つことなく不要領域の再利用を可能にする
 ・ただしインデックスを持たない列への更新時など、条件あり

●FILLFACTOR(P.110-111)
 ・更新、削除がない場合(挿入、検索のみ)であれば100%の設定でOK
 ・更新に対しては、空き領域が二行分のサイズになるようにする。
  そうすると一度に二つの更新がこない限り、空き領域を交互に使ってくれる。
  (新規ページを作成しない)
 ・下限は一般的に70%とされる

○部分インデックスは、特定の条件を満たす行の値のみをインデックスの対象とし、列値の分布に偏りがある場合に有効です。(P.118)

●稼動統計情報ビュー(P.133、P.201-203)
 ・pg_stat_database:コミット・ロールバック数、キャッシュヒット率、デッドロック発生有無
 ・pg_stat_user_tables、pg_statio_user_indexes:キャッシュヒット率
 ・pg_stat_activity:トランザクションの実行時間、実行中のクエリ
 ・pg_locks:ロック待ちプロセス

○クライアントからの要求を1つのプロセスが処理する
 プロセスモデルのアーキテクチャを採用しています。(P.138)

○PostgreSQL9.2以降では、
 少なくとも64コアのサーバまでCPUスケールすることが確認されています。(P.138)

●I/Oスケジューラ(P.146)
 実際のI/O要求は、bgwriter(データ書き込みプロセス)、
 wal writer(WAL書き込みプロセス)が占めるため
 deadlineに設定することが推奨されてきました。
 RAIDドライバに任せたほうが効率的な場合、
 またSSDのようなランダムI/Oに強いデバイスの場合、
 noopを設定することも選択肢となります。

○チェックポイントが発生する前にバックグラウンドライタが
 ダーティバッファ(更新のあったデータ)の書き込みを行うことで、
 I/O負荷を標準化できるため、データベース全体の性能を維持できます。
 ただし、設定値を大きくするとリカバリに掛かる時間が延びるため、
 リカバリ時間の見積もりを勘案したした設定値に調整することが必要になります。(P.149)

●正常動作の監視として、
 OSのvmstat、netstat、iostat、sarなどのコマンドを利用します。(P.196-199)

●断片化(P.216)
 ・インデックスファイルの大部分で断片化が起こると、
  キャッシュヒット効率が悪化し、性能に悪影響をおよぼします。
 ・断片化を調べる方法
  contribモジュールのpgstattupleに含まれるpgstatindex関数が使えます。

●INDEXの作成方法(P.220)
 ・REINDEXを実行すると対象テーブルはロック状態になります
 ・CREATE INDEX CONCURRENTLY は一時的に別ノンデックスを作成するので、
  ロックを取得しません。

●推定の基準となるコストは、random_page_costとseq_page_costで設定されています。
 デフォルトの設定ではHDDを前提としてrandom_page_costが4.0に対して、
 seq_page_costが1.0で計算されています。
 (中略)
 SSDを用いる場合はディスク特性がHDDとは異なることも考慮します。(P.227)
○SSDは、シーケンシャルアクセスとランダムアクセスの性能差がほとんどないため
 コスト比も1:1に近づけることが必要になります。(P.265)

●収集した統計情報はシステムカタログ(pg_satistic)に格納されます。
 (中略)
 テーブルの内の最頻値リスト(most_common_vals)やその出現頻度(most_common_freqs)、
 値の物理的な並び順と論理的な並び順の一致度合い(correlation)などを
 参照することができます。(P.235)

●結合(P.245)
 ・入れ子ループ結合 < ハッシュ結合 < マージ結合
 ・ハッシュ結合は小さいテーブルと大きいテーブルの結合が得意
 ・マージ結合はソートしておいて結合する

○メモリ上で実行できる場合にはクックソートを用いますが、 
 それ以上のサイズになるとソート結果をファイルに書き出す外部ソートになります。(P.247)

コメント

このブログの人気の投稿

Excelのマクロの差分もGitHubみたいに見たいよね

なんやかんやでまだ残っているExcelマクロ。修正したはいいが、差分が・・・。 Google先生に聞いてみるとWinMergeでできるらしいが、なぜかうまくいかない。 そう、WinMergeもExcelもバージョンが新しくなっていたのでうまくいかなかったみたい。 前提は Excel 2013 WinMerge 2.14.0-jp63 over です。 以下差分を確認するための手順です。 WinMerge をインストール ここから WinMerge の2.14.0-jp-63 より新しいバージョンをダウンロード 画面に従ってぽちぽち押していけばいい。 ただし・・・このときに必ずカスタムインストールで プラグイン にチェックを入れること!!(このプラグインを利用します) WinMerge のプラグインの設定変更(やらなくてもOK) WinMerge を起動 プラグイン → プラグインの設定 → CompareMSExcelFiles.sct をダブルクリック ”ワークブックの情報を複数ファイルに展開する” にチェックを入れる Excel の設定変更 ファイル → オプション → セキュリティセンター → セキュリティ センターの設定 ボタンを押下 マクロの設定 を選択 ”VBA プロジェクト オブジェクト モデルへのアクセスを信頼する” にチェックを入れる WinMerge で差分を表示する WinMerge を起動して、比較したいファイルを二つ選択する プラグイン → 展開プラグインの選択 → ファイル展開プラグイ に CompareMSExcelFiles.sct を選択して OK ボタンを押下する 各シートの差分と合わせて、*.bas の形式でマクロの差分が表示される(はず)

間違ったフォーマットのプログラムじゃないんだけど

以下エラーに対し、 ファイルまたはアセンブリ 'SSPI'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。 以下環境で対応した話です。 VisualStudio2012(C# ASP.NET MVC4.0) IIS7.5 とあるところのdllを使用中 ASP.NETをIISに発行しようとしたら、上記エラーが発生。 他のプロジェクトでは問題なく発行できているのに、 何かと思ってみたら、google先生に尋ねてみると、 DLLファイルの対象プラットフォーム(32bit/64bit)が異なる とのことでした。 このサイトでは対処方法として、 運用環境のプラットフォームに合わせ、適切なランタイムファイルを配布してください。 と記載されていますが、今回の私のようにとあるところのdllを使用している場合などは、 そうもいかない場合もあるでしょう。 そこでdllを変更できない場合には、 IISのアプリケーションプールの設定で、 32bitアプリケーションを有効化してあげることで対応できます。 以下手順です。 コントロールパネル → 管理ツール → インターネット インフォメーション サービス (IIS) マネージャー を起動します。 変更したいアプリケーションを右クリックして、詳細設定を選択します。 32ビットアプリケーションの有効化をTrueに変更します。 もう一度発行します。 ここまでです。 簡単だけど知らないとなかなかはまるかなって気がしますね。 独特のくせなのかもしれません。 そして、次なるエラー発生中です・・・。

SQLServer2008でのトランザクションログの切り捨て方

SQL Server 2008でとあるDBのトランザクションログが一杯に。 BACKUP LOG DatabaseName WITH TRUNCATE_ONLY を使ってトランケートしようとしたら、 'TRUNCATE_ONLY' はBACKUP オプションとして認識されません。 との冷たい返事。2008で廃止されていたのを忘れていた。 SQL Server 2008 で廃止されたデータベース エンジンの機能@MSDN そこでヌルデバイスを使用してバックアップを取得する方法で、切り捨てを試みる。 BACKUP LOG DatabaseName TO DISK = ‘nul’ GO するとまた冷たい返事。 現在、データベースのバックアップが存在しないので、BACKUP LOG を実行できません。 2008では過去にフルバックアップを取得しておかないと、ランザクションのバックアップが取得できないことを忘れてた。てなわけで、まずはデータベースのフルバックアップを取得して、 BACKUP DATABASE DatabaseName TO DISK = ‘nul’ GO もう一度トランザクションのバックアップをして、やっと切り捨てれた。最初から単純にしておけばよかった・・・。