投稿

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

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

前回 はオプティマイザー周りに入ったのでした。 home / postgres / src / backend / optimizer / README 多分 optimizer の planner.c あたりを読み進めると検索プランの作成方法が、 Portal あたり(どこだ?)を読み進めると、検索プランに従って実際に検索を行う処理が見つかる気がする。 今回は Portal の方にあたりをつけて読み進めてみることにする。 CreatePortal https://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/README readmeみる mmgr は Memory Manager っぽい Context単位でメモリ管理をするようなモデルらしい PortalDefineQuery parseされたStatementを受け取っているので、ここで実行? statement 名を設定しているだけだった。。。 PortalStart https://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 - 名無しのステートメントを除去?一端とばす MemoryContextSwitchTo pg_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 拡張問い合わせ Parse Bind Execute 関数呼び出し FunctionCall(非推奨らしい、Bind & Executeを利用せよとのこと) その他特殊な操作向け Copy など... 接続終了 PostgresMain ではこのプロトコルの内、接続開始後の各サブプロトコルの種類を判別してそれぞれのサブプロトコルで定義される操作を呼び出している模様。 簡易問い合わせと拡張問い合わせの概要は次の通り。 "簡易問い合わせ"プロトコルでは、フロントエンドはテキストで問い合わせ文字列を単に送信し、バックエンドによって解析され、即実行されます。 "拡張問い合わせ" プロトコルでは、問い合わせの処理は、解析、パラメータ値の結び付け、そして実行という複数の段階に分離されます。 これは複雑性が加わりますが、柔軟性と性能という点で利点が生まれます。 このあたりを念頭に各操作の内容を読んでいけばなんとかなりそう。 その他 演算子クラス/演算子族 ひたすらドキュメントを読んでたらインデックス周りで演算子クラスとか演算子族というのが出てきた。 インデックスの種類やデータ型ごとに演算子クラスをユーザが定義することで、独自にインデックスを拡張できる?らしい。演算子クラスをまとめたのが演算子族?なのかな?インデックス周りを確認するときにもうちょっとちゃんと調べる予定。 htt

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 とかめっちゃでてくる!