初投稿になり、ご回答いただく上で必要な情報などが欠落している場合にはご指摘ください。
前提・実現したいこと
- PostgreSQLにおいて、外部ネットワークに存在するDB対してselect文を実行した際に、ネットワーク帯域をフルで使ってデータの取得を行いたい
発生している問題・エラーメッセージ
- postgresqlでselect文実行時に外部ネットワークにあるクライアントから実行すると、結果が返ってくるのに時間がかかる。
- DBと同一第3セグメントに置かれるクライアントから同一クエリを実行した場合に比べて、15倍以上時間がかかる。
該当のクエリ
SELECT * FROM tableName
対象となるテーブル
- テーブルサイズ:1.5GB
- 行数:約860000
- 列数:4(A,B,C,D)
- インデックス:各列ごとにbtreeインデックスを使用
CREATE INDEX idx_A ON public.A USING btree;
試したこと
- ネットワーク帯域が不足していることを疑って、同じクエリを並列で走らせたが、**1クエリ実行時の速度(bps)×並列数の速度(bps)**となるため、帯域不足ではない。
- 外部からアクセスする場合、FWなどの制限があるため、FWの設定をすべて無効化して実行したが、ネットワーク速度に変化はなかった。
- レコードを一度に取得するのではなく、limit句を追加することで1000行ずつ取得するようにしたが処理速度に変化はなかった(86400行で100minかかるとすれば1000行ならその100min/864かかった)
- Select時のクエリでEXPLAIN ANLYZEを実行した結果は以下
Seq Scan on tableName (cost=0.00..50622.81 rows=854081 width=359)
- pg_stat_activityを利用し、クエリを受け取ってから処理完了までの時間を計測したところ、外部ネットワークのクライアントから投げたほうが、同一第3セグメントのクライアントから投げた場合に比べ15倍以上長くかかっていた。
お伺いしたいこと
- ネットワーク帯域に余裕があるにもかかわらず、外部ネットワークのクライアントからpostgresqlのDBにSelect文を投げると処理に時間がかかってしまう理由を知りたいです。
補足情報(FW/ツールのバージョンなど)
- DBが置かれているPCのスペック
OS: windows Embeded Standard 7
CPU:Core-i7-5700EQ(2.6GHz,Broadwell)
メモリ:DDR3 16GB
- postgreSQL
ver:9.5.3
- クエリ実行時の読出しは同一セグメントでは50Mbps、外部からだと3~5Mbpsのパフォーマンスとなっています。 設備と設定上は、同一セグメントでは1Gbps、外部は100Mbpsまで対応しています。
原因がわかる方、ほかに調査したほうがいいことをご存知の方いらっしゃいましたらご回答いただけますと幸いです。
よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー