postgreSQLでの単純な左結合のパフォーマンスの向上

パーカー

postgreSQLデータベースの2つのテーブル間で左結合を実行しようとしていますが、実行に約14分かかることがわかりました。既存のSO投稿から、このタイプの結合は数秒のオーダーである必要があるように思われるので、この結合のパフォーマンスを向上させる方法を知りたいと思います。使用して、w /のマシンで実行64-bit postgreSQL version 9.4.4ています。テーブルの構造は次のとおりです。Windows 88 GB RAMpgAdmin III

表A:「parcels_qtr」:

小包(テキスト)| 年(int)| qtr(テキスト)| lpid(pk、text)|

1,550万行あり、各列にインデックスが付けられ、「lpid」が主キーです。また、このテーブルを標準の真空プロセスで実行しました。

表B:「postalvac_qtr」:

小包(テキスト)| 年(int)| qtr(テキスト)| lpid(pk、text)| vacCountY(int)|

618,000のレコードがあり、「vacCountY」を除くすべてのフィールドにインデックスが付けられ、「lpid」が主キーです。これも標準的な真空プロセスを経ています。

データ出力で実行する場合、約14分かかります。一緒explain (analyze, buffers)実行すると、1分強かかります。最初の質問-このパフォーマンスの違いは完全にデータの印刷に起因するのでしょうか、それともここで何か他のことが起こっているのでしょうか?

そして2番目の質問ですが、この実行時間を数秒に短縮できますか?

これが私のSQLコードです:

EXPLAIN (ANALYZE, BUFFERS)
select a.parcel,
   a.lpid,
   a.yr,
   a.qtr,
   b."vacCountY"
from parcels_qtr as a
left join postalvac_qtr as b
on a.lpid = b.lpid;

そして、これが私の説明文の結果です:https//explain.depesz.com/s/uKkK

私はpostgreSQLにかなり慣れていないので、忍耐と説明をいただければ幸いです。

jmelesky

あなたはDBにかなりの仕事をするように頼んでいます。説明プランを見るだけで、次のようになります。

  1. テーブル全体を読み込む(postalvac_qtr
  2. に基づいてハッシュを作成する lpid
  3. 他のはるかに大きな表全体を読みます(parcels_qtr
  4. 各15MMをlpidハッシュし、既存のハッシュテーブルと照合します

これらのテーブルの大きさはどれくらいですか?これを確認するには、次を発行します。

SELECT pg_size_pretty(pg_relation_size('parcels_qtr'));

このハッシュ結合がディスクに流出していることはほぼ確実であり、その構造化(「これらの両方のテーブルからのすべてのデータを提供してください」)では、そうならない方法はありません。

インデックスは役に立ちませんし、できません。テーブル全体を要求している限り、インデックスを使用すると処理が遅くなるだけです。postgresはとにかくテーブル全体をトラバースする必要があるため、シーケンシャルスキャンを発行することもできます。

クエリのパフォーマンスがと異なる理由については、explain analyzeあなたが正しいと思います。1-クライアントに1500万行を送信することと、2-それを表示しようとすることの組み合わせは、実際のクエリを超えて大幅な速度低下を引き起こします。

それで、あなたはそれについて何ができますか?

まず、このクエリは何をしようとしていますか?完全にフィルタリングされていない、これら2つのテーブルのすべてのデータを取得する頻度はどれくらいですか。それが非常に一般的である場合は、要件の段階に戻って、そのニーズに対処する別の方法を考え出すことを検討することをお勧めします(たとえば、特定の年と四半期のすべてのデータを取得するのが合理的でしょうか?)。それが一般的でない場合(たとえば、毎日のエクスポート)、1〜14分で十分な場合があります。

次に、テーブルが肥大化していないことを確認する必要があります。あなたは重要な発生した場合updatedelete、あなたのテーブルの上のトラフィックを、それは時間をかけて、それらを成長することができます。autovacuumデーモンはこれに対処するのに役立ちますが、場合によってはvacuum fullwillを発行することも役立ちます。

第三に、DB構成の調整を試すことができます。にはpostgresql.conf、サーバーがディスクキャッシュに使用できるRAMの予想量や、サーバーが並べ替えや結合に使用できるRAMの量(ディスクに流出する前)などのパラメーターがあります。これらの種類のパラメータをいじることで、速度を向上させることができるかもしれません。

第4に、スキーマを再検討することをお勧めします。年と四半期を2つの別々の列として使用しますか、それともこのdateタイプの単一の列を使用する方がよいでしょうか。あなたがしたいですかtextキーを、またはあなたがより良いオフとなりますbigint(シリアルまたは由来のいずれかのtext可能性がより迅速に加わるであろう、列)?あるparcelyrqtrフィールドは、実際に両方のテーブルに必要な、またはそれらが一つのテーブルにデータを複製していますか?

とにかく、これがお役に立てば幸いです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

左結合でのCTEのパフォーマンス低下

分類Dev

Spannerでの左結合のパフォーマンス

分類Dev

単純な SQL 選択のパフォーマンスを向上させる

分類Dev

SQLServerでの内部結合と左結合のパフォーマンス

分類Dev

MS AccessSQL結合のパフォーマンスの向上

分類Dev

SQL内部結合-パフォーマンスの向上

分類Dev

単純な場合のサブクエリのパフォーマンス

分類Dev

単純なfind-execコマンドのパフォーマンスを向上させます

分類Dev

単純なクエリでのパフォーマンスの問題

分類Dev

SQL結合カウントクエリのパフォーマンスの向上

分類Dev

結合による大きなテーブルの更新のパフォーマンスの向上

分類Dev

mysqlで複数の結合を適用する際のパフォーマンスの向上

分類Dev

Javaでの文字列連結のパフォーマンスの向上

分類Dev

2つの左結合とユニオンのパフォーマンス

分類Dev

文字列ベースでクエリ結合のパフォーマンスを向上させる方法は?

分類Dev

マングースのような単純な結合SQL

分類Dev

パフォーマンスのforループとfor ...の単純なJavascript

分類Dev

文字列の大きなベクトルで単語スコアの合計を計算するパフォーマンスを向上させますか?

分類Dev

INSERTでPostgreSQLのパフォーマンスを向上させる方法は?

分類Dev

配列と結合の間のPostgresqlパフォーマンスの比較

分類Dev

JNAパフォーマンスの向上

分類Dev

Rパフォーマンスの向上

分類Dev

AmazonSQSパフォーマンスの向上

分類Dev

Pythonでの非常に大きな辞書のパフォーマンスの向上

分類Dev

Goでのrows.Scan()のパフォーマンスの向上

分類Dev

Sparkでのdistinct + groupByKeyのパフォーマンスの向上

分類Dev

セロリを使用した単純なタスクでのパフォーマンスの低下

分類Dev

オラクルでは、簡単な選択クエリのパフォーマンスを向上させる方法

分類Dev

反復的なgroupby操作のパフォーマンスの向上

Related 関連記事

  1. 1

    左結合でのCTEのパフォーマンス低下

  2. 2

    Spannerでの左結合のパフォーマンス

  3. 3

    単純な SQL 選択のパフォーマンスを向上させる

  4. 4

    SQLServerでの内部結合と左結合のパフォーマンス

  5. 5

    MS AccessSQL結合のパフォーマンスの向上

  6. 6

    SQL内部結合-パフォーマンスの向上

  7. 7

    単純な場合のサブクエリのパフォーマンス

  8. 8

    単純なfind-execコマンドのパフォーマンスを向上させます

  9. 9

    単純なクエリでのパフォーマンスの問題

  10. 10

    SQL結合カウントクエリのパフォーマンスの向上

  11. 11

    結合による大きなテーブルの更新のパフォーマンスの向上

  12. 12

    mysqlで複数の結合を適用する際のパフォーマンスの向上

  13. 13

    Javaでの文字列連結のパフォーマンスの向上

  14. 14

    2つの左結合とユニオンのパフォーマンス

  15. 15

    文字列ベースでクエリ結合のパフォーマンスを向上させる方法は?

  16. 16

    マングースのような単純な結合SQL

  17. 17

    パフォーマンスのforループとfor ...の単純なJavascript

  18. 18

    文字列の大きなベクトルで単語スコアの合計を計算するパフォーマンスを向上させますか?

  19. 19

    INSERTでPostgreSQLのパフォーマンスを向上させる方法は?

  20. 20

    配列と結合の間のPostgresqlパフォーマンスの比較

  21. 21

    JNAパフォーマンスの向上

  22. 22

    Rパフォーマンスの向上

  23. 23

    AmazonSQSパフォーマンスの向上

  24. 24

    Pythonでの非常に大きな辞書のパフォーマンスの向上

  25. 25

    Goでのrows.Scan()のパフォーマンスの向上

  26. 26

    Sparkでのdistinct + groupByKeyのパフォーマンスの向上

  27. 27

    セロリを使用した単純なタスクでのパフォーマンスの低下

  28. 28

    オラクルでは、簡単な選択クエリのパフォーマンスを向上させる方法

  29. 29

    反復的なgroupby操作のパフォーマンスの向上

ホットタグ

アーカイブ