- - PR -
DBのメモリについて
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-08-09 01:50
いつもお世話になっております。
下記にも色々と投稿しているのですが、 現在以下の環境でサイトを構築しています。 WEBサーバ OS:LINUX 言語:PHP5 DBサーバ DB:PostgreSql8.3.1 全文検索機能Luidaをインストール 現在DBサーバの件数が一番多いテーブルで約2200万件あります。 そこで質問なのですが、現在DBサーバのメモリが1Gなのですが、 これは少ないのでしょうか? 時々検索に時間がかかるときがあったり、さらにORDERBY句を利用すると かなり遅くなってしまいます。 やはりメモリ増設したほうがよろしいでしょうか? また、現在のメモリ使用量などが分かる方法などあるのでしょうか? 申し訳ありませんが、どなたかご教示ください。 以上 よろしくお願い致します。 [ メッセージ編集済み 編集者: JDOG 編集日時 2008-08-11 17:38 ] | ||||||||||||||||||||
|
投稿日時: 2008-08-10 00:27
×SentOS
○CentOS まあそれはともかく。 データ量が 2200 万件とはいえ、この情報だけでは 1GB のメモリで足りるかどうかは判断するのは難しいかと。処理の内容によりますし。 (まさか 2200 万件をフルスキャンするなんてことはないでしょうが) order by するときに遅いってことだとしたらwork_memの調整になるのかな? デフォルトは 1MB らしいのでこれを調整してみるとか、shared_buffersを調整するとか、そもそも実行するSQLで無駄な全件検索してないかとか、そういう観点の調査もしてみる必要があるかと思います。 Google大先生に "PostgreSQL" "メモリ" "パラメータ" で検索するだけでも結構ヒントが見つかりますよ。こことか。 | ||||||||||||||||||||
|
投稿日時: 2008-08-10 01:34
ORDER BYはPostgreSQLの8.3以降では多少早くなったと聞いたことがありますが、
基本的にそんなに軽い処理ではありません。 チューニングが面倒だけど、とにかく早くしたいというなら、 数十ギガでも増設すればいいと思いますが、 まずはボトルネックを探しましょうよ。 実行プランを見るといいと、以前アドバイスしたと思いますが、 SQLで解決 → パラメータで解決 → ハード増強で解決 というようにきちんと手順を踏んだ方がいいですよ。 | ||||||||||||||||||||
|
投稿日時: 2008-08-10 19:21
大規模&性能を出す必要があるシステムでは、「ソートの発生するSQLの記述は禁止」 といったプロジェクトもあります。 どうやればソート抑止できるかというと、インデクスを活用します。 そういった設計が、そもそもできていないのでは? | ||||||||||||||||||||
|
投稿日時: 2008-08-11 09:33
ほったて様
返信ありがとうございます。お勧めサイトを参考にして、もう一度色々と試してみます。 かつのり様 返信ありがとうございます。かつのり様の言うとおりボトルネックを探して、再度実行プランを考え直します。 忠犬様 返信ありがとうございました。一応インデックス等の活用は行っています。 引継ぎ案件のため、細かい設計までまだ把握していませんが、再度設計の見直しを行いたいと思います。 皆様ご教示ありがとうございました。 | ||||||||||||||||||||
|
投稿日時: 2008-08-27 15:06
メモリの使用量などはmem,topや
$ ps alx | head -1 && ps alx | grep post*などそもそもapacheとpostgresqlを併用して問題ないか確認したんですよね?order byは全部のデータを読み込むでないにしろ、瞬間的なメモリ・CPUのリソースくいは大きくなると思います。しかし、メモリ容量はCPU使用率が常時100%でないのであれば、目的のデータを取得するまでに時間がかかっている、つまりSQL文がまずいわけです。ひどい話、それだけ大規模なDBならばテーブルだけ指定してwhere句でフィルターしてなければ、完全なシステムのボトルネックとなると思います。同じLAN内であり、スイッチハブ経由であればネットワーク関係で時々遅くなるという現象はないでしょうし、ブラウザもタブブラウザなどwebFormのnewであればアプリケーションのnewとは違って時々遅くなるというクライアント機の原因にはなりません。チューニングにしてもwork_mem以外はデフォルトで問題ないと思います。 | ||||||||||||||||||||
|
投稿日時: 2008-08-27 21:19
ORDER BYを指定しないで結果の順序を保証するRDBMSがあるんでしょうか? | ||||||||||||||||||||
|
投稿日時: 2008-08-27 23:19
回答の意味を誤解しているのでは? インデクスは、データの絞込み以外に、order by、group by、distinctなどの指定に伴って発生するソートを抑止するためにも使われます。 例えば、下記のような表定義があったとします。
そして、次のようなSQLを実行するとします。
この場合、上記の表、インデクス定義では、「c1、c2、c3」列でのソートが作業ファイル等を用いて発生します。 一方、下記のようなインデクスを定義しておけば、作業ファイル等を用いたソートを抑止できる場合があります。
再び引用です。
特異な例ですが、SQL Serverは、primary keyがあれば、primary keyでソートするようです。これは私の印象でなく、マニュアルにそういった記載があり、実際に試したところ、確かにprimary key順になるようです。 また、MySQLでも将来的な計画の中に、「order by指定がない場合は、primary keyでのorder byを内部的に生成したアクセス計画を作る」といった案があるようです。 しかしながら、標準SQL、殆どのRDBMSでは、「order by指定がない場合、検索順序は保証しない」ということが常識であることに変わりありません。 |