質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3788閲覧

Postgresqlを利用した集計処理が遅くなる

y.sudo

総合スコア19

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/09/26 08:02

お世話になります。

Postgres8.3+PHPを利用した集計バッチを作成し、そのバッチを
20回程連続でcurlを使用して呼び出しておりますが、10回程経過
した時点で極端に処理が遅くなり困っております。

バッチの中身はPHPから標準のpg関数を使用して、概ね以下の通りです。

1.curl http://~~で実行
2.トランザクション開始
3.select-update
4.select-insert(not exists 2.)
5.3-4を数回ループ(見るテーブルを変更)
6.コミット or ロールバック

途中でパフォーマンスが落ちるので、リソースの問題だと思うのですが
一度遅くなると、スクリプトを終了させて再び実行しても遅いままで、
Postgresを再起動すると直ります。

ただし遅くなる状態でも、上記バッチとは関係のない処理は問題なく
バッチの特定のテーブルからのレスポンスが悪いような印象です。

Postgresにテーブル別にリソースを管理する仕様やそれの確認方法、
また再起動以外での対処の仕方、スクリプト中で防ぐ方法など、
何かご存知の方おられましたらお教えいただければと思います。

※fsmあたりが怪しいとは思い、vacuume verboseの値とconfの設定値を
現在比較中です。。
※リソースの消費として速度重視と思って採択したselect-insertの
selectサイズが大きすぎると思ってますが、スクリプト終了後も
継続してしまう理由がわからない状態です。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

原因は特定できていますか?
対策・対処を行うのはその後かと思います。

以下の2点は問題ありませんでしたか?

  1. 発行しているSQLでインデックスは正しく利用されているか(Explainで確認する)
  2. postgresqlのログに警告等はでていないか

投稿2016/09/30 06:42

KenRai

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

indexは定義されているのであれば、遅くなった時点でreindexをされてみてはいかがでしょうか?インデックスが沢山有る場合は効果が有る事も有ります。

投稿2016/09/27 03:01

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y.sudo

2016/09/28 01:18

ご回答ありがとうございます。実は色々いじっている最中にreindexを行ったのですが、直後のバッチ起動で非常に遅くなり、reindexは躊躇してました。 (恐らくreindexのせいではなかったのかもしれませんが、再構築後の1回目は時間がかかるのか。。と躊躇してました) 遅くなってから一応indexが効いているかは調べ、8割ぐらいは効いている感じでしたので問題ないとは思うのですが、再度試してみます。(明日から休みに入ってしまう為、数日後に) ありがとうございました!
A.Ichi

2016/09/28 01:30

reindexはLOCKをかけると思いますので他の処理と一緒には行わない方がよろしいかと
y.sudo

2016/09/28 01:36

あ、書き方が微妙でした。勿論reindex実行中は他に何も実行はさせておりません。色々試行錯誤をしている中の1つにreindex、という意味です。申し訳ございません。。) ありがとうございます!
A.Ichi

2016/09/29 00:38

再構築後の1回目は時間がかかる場合、再構築時に最初にインデックス定義せずにcopyまたはinsertを行なった後でインデックスを作成する方法が有ります。プライマリでもできます。
A.Ichi

2016/09/29 01:07

php中でvacuum table_nameで特定し実行する方法も有ります。(コミット後)
guest

0

各テーブルのデータ量が現行のハードウェアの性能で追いつけるか?SQLのWHERE句で指定している列にきちんと索引が設定されているか、など調べないといけない点が多々ありそうです。

ググると、
パフォーマンス統計情報のスナップショットを取得する
PostgreSQLパフォーマンスチューニングのために ~重いSQLの見つけ方~
などいろいろ見つかります。

ご質問の様子からパフォーマンス・チューニングにはあまり経験がなさそうなので、熟練者の応援を頼まれた方が良さそうな気もします。

投稿2016/09/26 08:45

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y.sudo

2016/09/26 12:22

ご回答ありがとうございます。 indexは定義しておりますが、同じ対象テーブルで同じsqlでも、一度重くなってしまうとパフォーマンスが落ちる感じですので、どちらかというとconf周りの設定も絡んでるような気がします。 ご推察通り、チューニング経験はあまりなく、熟練者の応援を頼みたいところですが、現場にそのような人はいないため、私がやりきるしかないのが現状です。
Orlofsky

2016/09/26 13:13

1~6の各処理時間でいちばん処理時間がかかっている部分はどれか把握できていますか? SQL部分でしたらテーブル名や列名を置換するなどして、差支えない範囲でCREATE TABLE, CREATE INDEX、各テーブルのレコード件数、WHERE句の条件でデータを絞れた時のレコード件数などを提示できればコメントが付くかもしれません。ここではなく、質問を修正してください。 パフォーマンス・チューニングは有償・無償いろいろツールも入手できますから、試されては?サーバーを買い替えるよりは安く済むかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問