[pgsql-jp: 36016] Re: EXPLAIN ANALYZE SELECT文の検索結果時間とPHPで実行した際の検索時間の違いについて

ces h nkjmhrk @ hotmail.com
2005年 9月 16日 (金) 21:01:29 JST


cesです。
返信有難うございます

OSはunameコマンドで調べたらAIXと出てきました。これはUNIXですよね?

>他の部分は流し読みですが、恐らく offset / limit 構文を使用していないせい
すみませんです。質問内容で略してた部分がありまして、
検索にヒットした全データをCSVに出力して直接ユーザーが落とせるようにCSV
ファイルを
ダウンロード出来るようにしたいと思っていまして、
先ほどのSQL文はそのSQL文に当たるために
ダウンロードの際にはlimit,offsetとを使用していませんでした。
(検索条件にヒットしたデータをただ見るだけの時には、
limit,offsetを利用して1ページで表示させる件数に制限をかけています。
その時には2分程はかからずに検索は終了しています)

>#5000行もの結果を取得する必要があるとしたら基本構造を変える必要が
実際にデータとして登録されている件数は約7万件です・・・。
もしそれをユーザーが何も条件なしで検索してCSVダウンロードをした場合には
7万件のデータを取得しなければいけなかったりします・・・。

検索に時間がかかってしまう為に、
CSVを直接出力してダウンロードというやり方は断念して、
PHPからDBサーバーに接続して、シェルスクリプトを利用して
DBサーバーでSQLを直接打込む方法をとってました

シェルスクリプトで実行させるSQLはPHP側で作成してます。
SQLは
1.にヒットしたものを新しいテーブル生成するもの。(CREATE TABLE 〜 AS 
SELECT )
2.文字コードを変更するもの。(EUC→SJIS)
3.そのテーブルをCOPYでcsvファイルをDB内に生成するもの。( COPY 〜 
TO )
4.作成されたテーブルの削除。( DROP TABLE )
の4つのSQLを実行させています

とりあえずこれで検索にヒットしたデータをCSVに出力できるようになったのです
が、
ここでもまた問題が出てしまったのです。
その問題とは検索にヒットした件数が多いと
Memory exhausted in AllocSetAlloc(364)というエラーが出てしまうという事です。

http://www.linet.gr.jp/~juk/plamo/parts/2.2.5/scripts/pgsql/faq-japanese.txt

↑のURLに原因っぽい事がかかれてたので、その通りに対策をしてみたんですけど
ダメでした。

ですので検索のヒットした件数を分割してCSVファイルを分けて生成してみた所、

上のエラーメッセージが出なくなりました。
ただ1ファイルに3000件ぐらいじゃないと上のエラーが出てしまうっぽいので、

全件をCSVファイルに出力するとなると、23ファイルぐらい生成しなくてはなら
ないっぽいのです。
(最後まで動作させずに止めてるので確認はまだしてません)

どうすればいいかな?と悩んでた時にSELECT文の結果がすぐ戻ってくるようになれば

PHP側にCSVの出力などをやらせちゃえば
上のメモリが足りないとか解決できるかも?
という風に思い最初の質問のような内容にしました。

>DBサーバ側かWebサーバ側(もしくは両方)のメモリリソースではないでしょうか
もし仮にSELECT文の結果が遅い原因が↑のような
原因だとなるとこちら側ではもうどうしようもないでしょうか・・・?
それとも何か他に良い方法がありますでしょうか?

>ならば top コマンドなどでメモリ及び swap の消費量をみると原因が推測
現在は教えて頂いたコマンドを使用してメモリリソースが原因か調べてますけど、
シェルは苦手というか今回のこういた事が起きてから触り始めたばっかりなので
どうしたらメモリリソースかチェックしていいのか分らなくて困っています。

topコマンドは使えないみたいでした。
ksh: top:  見つかりません。
と出てしまいました。
psだと使えるみたいなのですがpsコマンドとかでわかりますでしょうか?

長くなってしまいましたがよろしくお願いします

_________________________________________________________________
ウィルス駆除も無料の 「MSN Hotmail」  http://www.hotmail.com/ 




pgsql-jp メーリングリストの案内