1

わかりました、質問が少し曖昧であることを感謝しますが、グーグルで一日を過ごした後、私はどこにも行きません.

問題は、特定のテーブルに約 1,000 ~ 1,500 万行の PostgreSQL データベースがあることです。

テーブルの DateTime フィールドに基づいて、すべての列の選択を行っています。結合はなく、where 句 (時間 >= x AND 時間 <= y) を使用した標準の選択のみです。フィールドにもインデックスがあります...

ローカル マシンで psql を使用して sql を実行すると、約 15 ~ 20 秒で実行され、50 万行が返されます。そのうちの 1 つは、行ごとに大量のデータを保持するテキスト フィールドです (プログラム スタック トレース)。 . 同じ SQL を使用して Npgsql、または Windows の pgadmin III で実行すると、約 2 分かかります。

これにより、ネットワークの問題であると考えるようになりました。クエリの実行中にマシンをチェックしましたが、大量のメモリや CPU を使用しておらず、ネットワーク速度もごくわずかです。

メモリ設定についても、Postgres サイトの推奨事項を確認しました。shmmax と shmall の更新を含みます。

Ubuntu 10.04、PSQL 8.4、4GB RAM、2.8GHz Quad Xeon (仮想だが専用リソース) です。マシンにはWindowsの対応物(2008 R2、SS2008)も搭載されていますが、オフになっています。クエリは、同じスキーマとデータで SS を使用して約 10 ~ 15 秒で返されます。これは直接的な比較にはならないことはわかっていますが、ディスク パフォーマンスの問題ではないことを示したかったのです。

質問は...何か提案はありますか?変更する必要があるネットワーク設定はありますか? 私が逃したものはありますか?データベースについてあまり多くの情報を提供することはできませんが、難読化された EXPLAIN ANALYZE を次に示します...

Index Scan using "IDX_column1" on "table1"  (cost=0.00..45416.20 rows=475130 width=148) (actual time=0.025..170.812 rows=482266 loops=1)
Index Cond: (("column1" >= '2011-03-14 00:00:00'::timestamp without time zone) AND ("column1" <= '2011-03-14 23:59:59'::timestamp without time zone))
Total runtime: 196.898 ms
4

1 に答える 1

0

psql で 1 に設定cursor_tuple_fractionしてみて、結果が変わるかどうかを確認してください。もしそうなら、オプティマイザーは、全体を取得するよりも上位 10% 程度の結果のみを取得することに基づいて、より良い計画を選択している可能性があります。Istr psql は、「firehose」executequery メソッドではなく、カーソルを使用して結果を 1 つずつフェッチします。

この場合、解決策を直接示しているわけではありませんが、プランナーの設定を微調整する必要があります。少なくとも psql で動作を再現できれば、違いを確認して変更をテストする方が簡単かもしれません。

于 2011-03-24T18:14:30.570 に答える