上記元ネタのほうには色々突っ込みどころ満載なのだが、それは置いておくとしてL.starなりの高速化ポイントを一度書いておかないと、と思ったので記す。L.starはもうPostgreSQL界隈から離れて久しいので、必ずしも最新の内容を網羅していないことに注意されたし。出来るだけPostgreSQLだけでなく、一般的なDBに活用できるように記述している。紙面と気力の都合もあるので、外部ツールとの切り分けとかの部分は記さなかった。LAP(P)ソリューションを本当に高速化したい人のための・・・がいるかもしれない。追記:外部ツールに関するエントリを書いた。そのデータベースの傾向を知らないことには、何も始まらない。RDBMSは汎用なので、実にさまざまな特色を持ちうる。それにより、いろんなものが異なってくる。そのため、L.starの経験では、どういうタイプかの特定なしに、意味のあるチューニングは出来ない。驚くべきことに、元エントリの16の方法では、この「特性」について一切ふれられていない。上げられている項目から見て、たぶんWebのバックエンドに多い、OLTP型。更新はちょっとで検索多めと言うことだろう。umitanuki氏も何も書いてないが、元々internalな部分に造詣が深い氏の場合は個別SQL向けチューニングポイントだろう。あなたのDBがこういった部分から外れていると、アドバイスはあまり役に立たなかったりする。具体的にどの程度違うかと言う例だが、ものすごく参考になる記事として、pgsql氏の以下のエントリから表を引用する。氏には是非これを8.5に入れるべく頑張っていただきたいが。(仮)ID1234pgbench-S-S-N(TPC-B)shared_buffers32MB4MB32MB32MBtps12894112451586896IDLE_IN_TRANSACTION0.0%0.0%46.2%44.0%CPU99.2%93.7%13.4%12.8%DATA_READ0.1%3.8%0.0%0.0%DATA_WRITE0.0%0.0%0.0%0.0%XLOG_WRITE0.0%0.0%18.1%5.6%XLOG_FLUSH0.0%0.0%0.0%0.0%LWLOCK_WAIT0.7%2.4%22.3%0.6%LOCK_WAIT0.0%0.0%0.0%37.1%このように、まったく同じテーブル定義だというのに、大きく差が出てくる。このタイプ分けにより、どのようなチューニングを施すべきかというのは決まってくるのである。以下に、どのようなタイプがあるか述べよう。そもそも、スキーマ設計の段階で検索を考慮したかこれはPostgreSQLに限らずの話。RDBMSの設計の最も初歩であるはずでありながら、ほとんど知られていないことがある。RDBMSは検索するツールであるから、そのスキーマはどのように検索するか?で決定される。何を格納するかではない。格納したいだけなら、インデックスなど要らないから、たんなるログファイルで良いのだ。スキーマを決め、そのあとSQL設計をするのは、行き先を決めずに旅行に行くぐらい愚かだと心しなさい。時間の掛かっているSQLから順にチューニングしろパレートの法則の変形であるが、問題のあるSQLはごく一部である。それを修正することに集中し、ボトルネックとなっているSQLを潰そう。pgfoundryには、ログから(実行回数*平均実行時間)の統計を取得してくれるツールがあったはずである。この種のSQL解析をおこなったあと、次々と実際に時間の掛かるSQLを潰していくことが本来のチューニングの第一歩である。個別のSQLの何が問題かは、explain文でプランを読み解くことによって明らかに出来る。L.starの知る限り、RDBMSを導入しているシステムというのは、このようなSQL(あるいはストアドプロシージャ)がボトルネックになっている。パラメータがどうこうというより、まずSQLを見直すことが重要であると心得なさい。それをそぎ落としたところで、ディスクI/Oがボトルネックとかそう言う話が出来るのである。書き込み中心のアプリケーションなら、ディスクの同期書き込みを制しろこれは書き込み中心のアプリケーションなら基本中の基本である。上記表の(3)にもあるとおり、データ書き込みが発生する場合のボトルネックはxlogへの書き込みである。waitなども含めつつ考えないといけない。書き込みががつんと遅くなるRAID5などは、この種のDBにとっては最悪の選択肢である。真のメンテナンスフリーのDBなどない。データの健全性のため、再構築には気を遣えautovacuumがあるから大丈夫、と言われることも多い。いわゆる主キー持ちupdate中心のテーブルにはだいたい当てはまるが、油断してはいけない。max_fsm_pagesを設定しているか?というのは重要なポイントである。これが足りなければいくらvacuumしても無駄である。本当の敵はTableのvacuumではなく、Indexのvacuumである。vacuumが効率よく働くケースと酷似している。ログテーブルとか、SNSでメッセージを格納するようなのは、単調増加型のIDを持つのが普通だろうが、こういう場合にはHOTも効かないしindexは肥大する。あと、vacuumは、deleteしてからすぐ効くのではなく、次のinsert時に再利用されると言う点は無視できない。fullやそれに類するもの(cluster,データが空ならtruncate。vacuumとは特性が異なるので注意)は必須である。ところで、pg_reorgってどうなんですかね?一見良さそうなんですが。メモリはwork_mem(ソート用メモリ)、shared_buffers(キャッシュ)のどっちに使うべきかは、インデックスを頻繁に使うかどうかを目安にしろこれは正直、バージョンによって大きく違うのだが、8.3系の場合はもはやshared_bufferは取れるだけ取って良いようだ。古いバージョンではロック管理が芳しくなく、多くするとロック待ちのために遅くなると言うことがあった。限りあるメモリをPostgreSQLの二大検索用メモリパラメータである、work_memとshared_buffersにどう割り振るか?である。これはOLTP系(インデックスを使った少数件数取り出し中心)かOLAP系(シーケンシャルスキャン中心になる、大量件数取り出し&多テーブルJOIN&集約)なのかによって決まる。シーケンシャルスキャンが多くなると、キャッシュヒットは見込めなくなる。そのためOLTP系ならshared_buffers中心OLAP系ならwork_mem多めと言う配分が決まる。絶対必要なのを除いてとにかく避けろ。RDBMSは、多数のプロセス/スレッドが走る。これらは競合しない限り並列実行による利益が享受できるが、ロック競合を起こすとそこはアムダールの法則の「マルチスレッドで実行できない状況」に従って、マルチスレッドでの性能向上を妨げる。マルチプロセッサシステムでの性能向上とは、すなわちこのロックを出来るだけ少なくすることにある。ユーザ側でもロックが発生する状況を熟知し、できるだけ競合が発生しないことを心がけないといけない。安直に「テーブルロックをかければいい」などというのは、性能面では御法度である。?ユニークIDの投入方法を考えてみよう。性能が良いのは以下の順である。max()でID生成たしかに3は、ロールバックが発生したときにIDが飛ぶケースを防ぐことが可能だ。性能低下は実際には2.の10倍以上になる。Indexは多すぎてもダメ、少なすぎてもダメここらへんから、大きな部分は押さえ終わったのでTIPS系に。Indexは検索を高速化するというのは周知の事実だが、更新を遅くするというのも理解しておいた方が良い。これの応用として、COPYで大量データ投入するときには、indexを全て外すというのがある。SQLはチューニングして、必要なだけindexを使うようにすべきである。そのとき、闇雲に増やすのではなく、考えて増やし、要らないindexは全てあとで消してしまうことを忘れないようにしよう。統計情報に注意しろPostgreSQLはコスト式Plannerしか持っていない。正しい統計情報があるかどうかは、SQLが高速に実行されるかどうかの重要なポイントである。コスト関連のパラメータをいじるなり、analyzeの機会を増やすなりして、できるだけその鮮度を保っておこう。取得した統計が正しいかどうかもポイントである。IDのような連続したデータであればそれほど問題がない。これがトリッキーなデータになると、とたんに不正確になる。不正確なデータは不正確なプランを招き、性能低下の原因になる。8.4ではdefault_statistics_targetは10->100と大幅に増えるあとは一時テーブルの場合analyzeどうするか、とかそういう話もあるけど、PostgreSQLで一時テーブルは、そもそも使ってはいけない。触って、マニュアルにもソースにも書いてない「ノウハウ」をつかめソース嫁とかマニュアル嫁とかは、他の2つにも書いてあるので飛ばしておこう。本当に重要なことは眺めても分からない。ソースを読み込んだり、マニュアルの行間に書かれているのを発掘しないといけない。それがノウハウである。ここに書いてあるのはノウハウとしてポイントを得ているように出来るだけ書いたつもりだ。ここに書いてあるよりもずっと重要なことは、実際に動いているものからしか知ることが出来ない。そもそも、あなたのシステムは1.で示した分類のどれか一つに当てはまるだろうか?たぶん複数の条件を備えているだろう。すると、相反するパラメータをどう設定するかとか、そう言う問題に引っかかる。正解は、残念ながらソースやマニュアルから導けない。試して触って、どうなるか確かめるしかないのだ。ここに書いてある9つのポイントを参考にしたりしなかったりしながら自分自身で「これは使える」「これはダメ」と言うのを確かめ、それをノウハウに昇華しよう。すれば、継続して最適な性能を維持できる真のDBエンジニアになれるはずだ。道のりは遠いが頑張って欲しい。発声練習.この文章の主題は「他人の移ろいやすい価値観に惑わされるのではなく、精神的に背骨が通ってないといけないよ」というもので、良くできていて、とても耳にいたい。微妙にしっくりこないように感じる。この文面は芸術家にとって半分正しくない。芸術にとっては、作品そのものやそれを生み出すプロセスに対して、「精神的な背骨」が通ってないといけない。一方で、芸術にとって自分の外「だけ」が唯一絶対の価値判断基準である。どれだけ背骨が通っていようが、聴衆に評価されない芸術には何の価値もない。聴衆がどれだけ間違っていて、芸術家がどれだけ正しかろうが、だ。#ただし、聴衆は変わりうるので、一度ダメだからと言って常にダメとは限らない。死後評価されるなどと言うのも珍しくないし。実査には聴衆もある程度予測可能ではあるので、よほどとんでもないチャレンジでもしない限り、おおむね「背骨」とも矛盾しない。違和感の原因は価値観の置き所であろう。このエントリの作者は大学の先生っぽいが、しかも理系の学問では無かろうか。理系の場合、理論によって評価が決まる部分が大きい。絶対の価値判断基準は「理論」であり、聴衆ではない。理論が正しければ、聴衆に対して「お前は間違っている」と堂々と説明できるのである。この人は「自分の内に価値観を持つ」ということを強く信じられるのだろう。自分の内の価値判断とはすなわち体得した理論であり、それに対する自信である。一方で、このように「絶対的な、自己完結可能な価値基準」というのは世の中では少ない。教育は基本的に与えられた問題に対して教師が設定した「正しい」解答(理論ではない)を与えると言うことに特化している。会社組織での行動とは、端的に言うとエアリーディングの固まりであり、理論による解答があったところでみんなに納得されなければ「協調性がない」と一発で断罪(ひどいときには粛正)の材料になる。学問にしたところで完全に自己完結可能ではなく、学会のような組織もあるわけで、程度問題である。言いたいのは価値基準を形成する部分に、大きな前提の違いがあると言うことだ。このエントリの筆者がそういう状況を認識できていないな、というのはコメント欄にあった以下の部分を見て確信した。長所と短所は背中合わせと言うくらいですから、逆に精神的な背骨のある人には出来ない事があるのではと感じたのです。(エントリ作者)価値判断の基準が自分の外にある人の利点ってなんでしょうね?他人の望むことが分かっており、かつ、自分がその望まれていることができるときに、双方ともに幸せになれることでしょうか。価値基準を自分の外に置くことの利点は、いうまでもなく社会の大多数を占めるビジネスマンなど、エアリーディング能力が最大限要求される世界に対する適応しやすさである。それに適応して勝ち残ったのが大学生なのである。彼らはまず「ルールが変わった」と言うことを理解しないといけないのだ。これが必ずしもうまくいっていない。今回卒業する彼は、このルールの変更に最後まで気づかなかったか、適応できなかったのだろう。このルールの変更はかなり大きなもので、高校生以前に制度的に教わる余地はまずない。そこで問題になるのはエントリの以下の部分である。して、自信がなかったのかといえば、たぶん、間違うことに対して恐怖をいだいているからだと思うよ。何で間違うことに対して恐怖を抱いているのかというと、まだ君には精神的な背骨が育っていないからだと思う。この人の理解ではたぶんこれは正しいのだろうが、学生から見ては間違っている。彼らが間違うことをおそれるのは、洗脳されているといっていいほど社会からたたき込まれているからだ。「間違うことにたいして恐怖を抱く必要がない」という洗脳解除をしないといけない。ないと、参照されている増田のように萎縮した考えを持つことになってしまう。「精神的な背骨が育っていないから」ではなくて、自分の意見を言わないのはそもそも研究の目的が理解できてないから。間違うのがわかってて、それを論破されるのがもうほぼ確実に予想出来てるのに、わざわざ自分からフルボッコされるようなこと言うわけないじゃん。黙ってるしかないじゃん。L.starは文章を書きながら頭を整理しつつ、この溝の深さを誰も理解していないことこそ、高等教育が行き詰まっている一つの理由なのではないかと思ってしまった。修士のころはもうほんとに教授と会うのがいやでいやで仕方なかった。今になって思えば怒られてるんじゃなくて、研究を進める上で重要ないろいろな視点を提供してくれてただけなんだけど、なにしろなんもわかってない状態だから自分のこと全否定されているように感じてた。博士課程に進まずに就職してたら、私だって間違いなく、大学院なんて教授が偉そうにしててろくでもないところ、あいつらは社会経験がないからな、博士なんて進まずにさっさと就職すべし、とか増田に書き込みしてたと思う。この文章を見る限り彼はおそらく修士から博士に移行する過程で溝を超えられたのだと思う。同時に、博士課程に進むべきでない理由というのは、なによりそこで教わる価値基準が異質だと言うことだ。自分の外に価値判断の基準を持たない人は、前述のエアリーディングの世界では生きていけない。そこは、どれだけその価値が正しかろうが、みんなの中に同じものがない、というだけで全て否定される恐ろしい世界だからだ。長くなってしまったが、これを書きつつ企業と大学、一体どっちの価値観が優先されるべきなのだろうかとずいぶん考えてしまった。ケースバイケースで結論は出ないのだが。この溝をきちんと埋める努力がなされない限り、強い社会というのは生まれないのでは無かろうか。学者vsビジネスマンで戦争をしていられるほど、社会は余裕があるわけではない。仕事柄、と言うわけではないがメッセージングクライアントが手放せない人間である。個人的には、やはりメッセンジャーを使うのが一番しっくり来る。最近クライアントがあまりにも増えすぎているので、どうにか統合できないかと思っている。今の所会社ではPidginを使っているが、これはあらゆる部分を統合できている反面、使っていても全然しっくり来ないという欠点もある。一つのパターンはbitlbee使って全部IRCにしてしまうやつで、これもインストールしている。これもいまいち使い込めていない。他の問題点として、たいていのクライアントはSkypeに対応していない。そこで最近使っているのがimo.imというWeb版のクライアント。これはWebベースのありきたりの機能を実現しつつ、SkypeもWeb上で使えるというしろものだ。http://imo.im/あともう一つ今日から使い出しているのがDigsbyというやつ。こいつはアプリケーションだが、たいていのIM以外にメールのクイックチェッカーと、facebook、linkedin,twitterとも連携できるようになっている点が新しい。ようは、ユーザー体験を全部一つに収めてしまおうという狙いだ。多機能なのに案外メモリ消費量も少ない。http://www.digsby.comいずれももうちょっと使ってみたいかなと思っている。個人的には、ブラウザが全ての情報のフロントエンドに立てるように、全ての情報の流れを管理する、個人秘書のような統合型クライアントが欲しいと思っている。RSS、メールやニュース、各種サイト、メッセージングなどを全部統合して見せたり、データを管理したり、自分から興味深そうなものを整理提案してくれるようなものだ。ソーシャルサイトはその機能の一部を代行してくれるのだが、しかしソーシャルブックマークから出てくるサイトだけでも膨大である。思いつつクライアントをえっちら書いていたことがあるのだが挫折してしまっている。重い腰を上げて、プログラムの練習がてらやってみるべきだろうか。「時の車輪」再開かハヤカワFTより出ている時の車輪シリーズ、特に4-6部は非常に面白いが、後半だれてきて伏線回収が進まず、次が最終話だというのにどうするんだろうね?と思っていたら作者は難病で無くなっていてショックだった。以下Wikipediahttp://ja.wikipedia.org/wiki/%E6%99%82%E3%81%AE%E8%BB%8A%E8%BC%AAと思ったら、なんと遺稿等を元に最終話を別の人が書くんだそうな。話のふくらみすぎた大ヒットシリーズの収拾を付けるなんてやりたくない仕事だな。「リベラルなのに護憲」?別におかしくなんてありません。「本当の日本のリベラル」こそまず改憲をめざせ帰国しました。