投稿

2015の投稿を表示しています

PyCon mini Sapporo に行ってきた #pyconsap

先日 PyCon mini Sapporo に行ってきた。最高だった。

内容については http://togetter.com/li/872506 あたりを見てもらうとわかると思う。
1セッション20分というのは聞く方としてはわりと楽特に LT が発表者が手練揃い。すごいスムーズかつ多彩な話題だったPython メインではない発表が多かったので Python 自体にさほど興味がなくても楽しめた発表で"Python は glue(のり)だ"って言う話があったけど、まさにそういう感じsakura さんのセッションが最高にあたまおかしかった。超最高です。ありがとうございます手元のメモには"ヤバイ"としか書かれていない。。。 「私はプログラミングが大っ嫌いです」#pyconsap — オム子( °⊿°) (@irasally) 2015, 9月 12#pyconsap "インデント,わかりますよね.こうシュッと……" "インデントめっちゃかわいいと思うんですよね" — ヽ(´・肉・`)ノ (@niku_name) 2015, 9月 12 ・・・ほんとうに僕たちの知ってるインデントの話だったのだろうか?

「SQL実践入門」がとてもわかりやすい

最近出た「SQL実践入門」を読んでいます。「達人に学ぶ〜」シリーズで有名なミックさんの新著で主にSQLのパフォーマンスについての話をメインとした本。
相変わらず説明がとてもわかりやすく非常によい本だったので紹介。

SQLとパフォーマンスについての話がメイン 個人的にDB関連の書籍の分類は大きく以下の3種類に分類して考えているのですが、本書については一番上のカテゴリにはいりそうです。(「プログラマのためのSQL」も一番上かな・・・)
SQL、パフォーマンス(実行計画)本著達人に学ぶSQL徹底指南書SQLパズル(積んでる・・・)などテーブル設計達人に学ぶDB設計徹底指南書理論から学ぶデータベース実践入門などDBMS製品個別の話(DB運用含む)内部構造から学ぶPostgreSQLSQL Server 2008 ビギナーズガイドエキスパートのためのMySQLトラブルシューティングガイド(読んでない・・・)など SQLの基本となる考え方、テクニック、実行計画の読み解き方といった所から、DBを使用する際のボトルネックをどのように解消していけばいいのかという話がメインになっています。
ミックさんといえば「達人に学ぶSQL徹底指南書」「達人に学ぶDB設計徹底指南書」が有名。両著は非常にわかりやすく、DB関連の入門書としてかなりオススメの2冊です。 本書は「達人に学ぶSQL徹底指南書」より一歩踏み込んだ内容になっており、恐らくそちらを読んでからの方が深く理解できそうです。
主にPostgreSQLとOracleの実行計画を確認しながら、話を進めていくような形になっているので、少なくとも実行計画とはなんぞや?くらいの知識があるとよさそうです。
なお、実行計画の読み方は本書内で説明されているのでなんとかなるかと。
SQL実行時に使用されるアルゴリズムがわかる この辺りちゃんと理解していないとオプティマイザーの気持ちがわからなくて、有効なインデックスの付け方や実行計画の操作が上手くできないのですよね。。。
SQL実行時に使用されるアルゴリズム(実行計画で見ることができる)にはそれぞれの操作毎に複数のアルゴリズムが存在します。 例)JoinNested Loop JoinHash JoinMerge Join 自分はDB関連の知識としては主にMySQLあたりから入ったので、MySQLでサポート…

PostgreSQLのコードを読む話(4)

前回はオプティマイザー周りに入ったのでした。
home/postgres/src/backend/optimizer/README

多分 optimizer の planner.c あたりを読み進めると検索プランの作成方法が、 Portal あたり(どこだ?)を読み進めると、検索プランに従って実際に検索を行う処理が見つかる気がする。
今回は Portal の方にあたりをつけて読み進めてみることにする。 CreatePortalhttps://github.com/postgres/postgres/blob/master/src/backend/utils/mmgr/portalmem.c#L196 http://127.0.0.1:9292/home/postgres/src/backend/utils/mmgr/READMEreadmeみるmmgr は Memory Manager っぽいContext単位でメモリ管理をするようなモデルらしい PortalDefineQuery parseされたStatementを受け取っているので、ここで実行? statement 名を設定しているだけだった。。。
PortalStarthttps://github.com/postgres/postgres/blob/master/src/backend/tcop/pquery.c#L436 実行準備とのこと なにやら strategy にしたがって動作している
PortalSetResultFormat 見てない
PortalRun 多分ここが実行。。。 時間切れだったので、次回はここから。 https://github.com/postgres/postgres/blob/master/src/backend/tcop/pquery.c#L706

PostgreSQLのコードを読む話(3)

前回の続き、フロントエンドとバックエンド間の通常操作サブプロトコルのひとつ、Queryを読んでみることにした。

ここから
https://github.com/postgres/postgres/blob/master/src/backend/tcop/postgres.c#L3969
exec_simple_queryに入ったhttps://github.com/postgres/postgres/blob/master/src/backend/tcop/postgres.c#L824
start_xact_command - トランザクション?いったん飛ばすdrop_unnamed_stmt - 名無しのステートメントを除去?一端とばすMemoryContextSwitchTopg_parse_query - クエリをパースしてツリーを作るっぽいコンテキスト戻しているツリーをトラバースしている。。。pg_plan_queries - クエリプラン作成?ここで色々しているとのことPortalってなんだろう?カーソルのことらしいCommandCounterIncrement トランザクション関連らしい。飛ばす
home/postgres/src/backend/access/transam/README トランザクションシステムの説明 pg_plan_queriesからオプティマイザーあたりに入った https://github.com/postgres/postgres/blob/master/src/backend/optimizer/plan/planner.c プラグインでoptimizerのプランナーフックを仕掛けることが可能っぽいpull_up_sublinks - any/existsを内部的にjoinに変形するらしい オプティマイザーの全体を俯瞰した方がよいかと思いREADMEを見るhttps://github.com/postgres/postgres/blob/master/src/backend/optimizer/README#L286 optimizerの動作についての説明がのっていた

時間切れ、次回はここから見ていこう。。。

PostgreSQLのコードを読む話(2)

前回の続き。先日のサッポロビームで活動してきた。
今回はほとんどコードを読んでいない。
postgres.c の PostgresMain の query とか parse とは?というあたりを調べた。
あとはPostgreSQLのドキュメントを色々読んでた。
"簡易問い合わせ"と"拡張問い合わせ" PostgreSQLのドキュメントの「フロントエンド/バックエンドプロトコル」が参考になります。通常利用される問い合わせプロトコルに"簡易問い合わせ"と"拡張問い合わせ"があるとのこと。
フロントエンド/バックエンドプロトコル
接続開始通常操作簡易問い合わせQuery拡張問い合わせParseBindExecute関数呼び出しFunctionCall(非推奨らしい、Bind & Executeを利用せよとのこと)その他特殊な操作向けCopyなど...接続終了
PostgresMain ではこのプロトコルの内、接続開始後の各サブプロトコルの種類を判別してそれぞれのサブプロトコルで定義される操作を呼び出している模様。

簡易問い合わせと拡張問い合わせの概要は次の通り。
"簡易問い合わせ"プロトコルでは、フロントエンドはテキストで問い合わせ文字列を単に送信し、バックエンドによって解析され、即実行されます。"拡張問い合わせ"プロトコルでは、問い合わせの処理は、解析、パラメータ値の結び付け、そして実行という複数の段階に分離されます。 これは複雑性が加わりますが、柔軟性と性能という点で利点が生まれます。 このあたりを念頭に各操作の内容を読んでいけばなんとかなりそう。
その他 演算子クラス/演算子族 ひたすらドキュメントを読んでたらインデックス周りで演算子クラスとか演算子族というのが出てきた。 インデックスの種類やデータ型ごとに演算子クラスをユーザが定義することで、独自にインデックスを拡張できる?らしい。演算子クラスをまとめたのが演算子族?なのかな?インデックス周りを確認するときにもうちょっとちゃんと調べる予定。 https://www.postgresql.jp/document/9.3/html/indexes-opclass.html Notify 肉さん情…

PostgreSQLのコードを読む話(1)

昨年末からちびちびとPostgreSQLのコードを読み始めた。 ちびちび読んでいるので、次読むときにどこ読めばいいか忘れるのでその記録。
とは言ってもそんなに C に堪能ではないので、結構飛ばしつつ流れを追っている段階。。。 まずはインデックスとかDBの物理ファイルあたりにたどりつくのが目標。 前回までに読んだところsrc/backend/main/main.c
コマンドでサーバーを起動したときの開始ポイント。まずはここからsrc/backend/postmaster/postmaster.c#PostmasterMain
マスタープロセスの起動部分。マスタープロセスから起動時に各種バックエンドプロセスが、コネクション接続時にバックエンドプロセスがフォークされる模様 今回読んだところsrc/backend/tcop/postgres.c#PostgresMain
コネクション毎にpostmasterからフォークして作成されるバックエンドプロセスのメイン部分。コネクションを通してクエリを受け取ったりする。。。はず 次回https://github.com/postgres/postgres/blob/master/src/backend/tcop/postgres.c#L3969 ここから。バックエンドでコマンドを受け取って種類ごとにゴニョゴニョするっぽい。 疑問次回読み始める箇所のコマンドにあたるものの位置づけがまだ把握できていない(queryの他にparseとかある。parseは何のparse?)ディレクトリ名のtcopってなんだ?DBの物理ファイルとかバッファプール関連の初期化箇所をすっ飛ばしたっぽい。。。Windows の場合は fork する代わりに exe ファイルを起動しまくっている? 役立つもの milkode - とりあえず選択して Shift + S!内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 - 概要がわかる。よいなるほどUnixプロセス ― Rubyで学ぶUnixの基礎 - fork とか signal とかめっちゃでてくる!