2016-06-22 4 views
0

私は巨大なSQLクエリを持っています。おそらく15-20のテーブルが関わっています。 6から7のサブクエリが再び結合されます。 このクエリでは、ほとんどの場合、500万レコードを実行して返します。Postgresクエリプランが変わり続ける - クエリを1分で完了し、時には決して終了しない場合があります。

このクエリがひどく書かれていても、1分で終了するクエリプランがあります。私は、クエリが実際に実行され、キャッシュされた結果を使用していないことを確認しました。

場合によっては、クエリプランがジャッキアップされて終了しないことがあります。私は毎晩、クエリに関係するテーブルの真空解析を実行します。 work_memoryは現在200MBに設定されています。これを2GBまで増やしてみました。私は、work_memoryが2 GBだったときにクエリが混乱するのを経験していません。しかし、私はそれを減らしてクエリを実行したとき、それは乱されました。今私は2GBにそれを増加させると、クエリはまだ混乱しています。新しい設定でリフレッシュされないクエリプランとは何か関係がありますか?私は自分のセッションで計画を破棄しようとしました。

この時点で私はwork_memとvacuum analyzeしか考えられません。スムーズに実行されているクエリに影響を与える可能性のあるその他の要素は、何も返されず、結果を返す結果となります。

設定に関する詳細が必要な場合は教えてください。またはクエリ自体?私も計画を貼り付けることができます...しかし、ここに貼り付けるためのクエリや計画や大きすぎる..

+0

範囲テーブルの15-20テーブル:遺伝的最適化ツールが起動します。geqo_limitを増やすか、テーブル参照の一部をCTEに追加します。すでにサブクエリがある場合は、これらの1つ以上をCTEに昇格させます。 – wildplasser

+0

oops、名前は 'geqo_threshold'です。デフォルト値は12です。これを高く設定すると(おそらく20が高すぎます...)、プランナーはすべての計画を評価するために**多くの時間**を必要とします。 (計画の数は、基本的にRTEの数で指数関数的です) – wildplasser

答えて

0

範囲テーブルにgeqo_treshold(通常は12)以上のエントリがある場合、遺伝的最適化ツールが起動しますこの質問に記載されているように、しばしばランダムの動作を引き起こします。

  • 増加geqo_limit
  • 移動CTEにあなたのテーブルreferencessのいくつか:あなたはすることによって、これを解決することができます。サブクエリがすでにある場合は、これらのサブクエリの1つ(または複数)をCTEに昇格します。 コンパクト CTE(結果のタプルが比較的少なく、外側のクエリへのキー参照があまり多くない)に収まるように、クエリ内のテーブルのクラスタを特定するのは一種の黒い芸術です。

geqo_tresholdを高く設定しすぎると(おそらく20が大きすぎます...)、計画者はすべてのプランを評価するのに多くの時間が必要になります。 (計画の数は基本的に指数関数的にRTEの数を増やします)にはクエリを実行するには数分かかることが予想される場合、数秒の計画時間はおそらく害はありません。

+0

GEQO設定の読み方はいくつかありましたか?私はかなりここに私の問題thatsだと確信しています。私のクエリは長すぎるだけで複雑なので、網羅的な検索プランを生成することはできません。そのGECOベースのヒューリスティック検索は、最良の計画を生むものではありません。私はgeqo_effortパラメータを微調整して、クエリの繰り返し部分をCTEの – Ramanan

+0

に分割します。しかし、クエリプランが乱れたら、データベース全体の空き領域を分析して問題を解決する方法がわかります。 GEQOは、真空分析後により良い計画を立てることができますか? – Ramanan

+0

それはちょうどランダム性と偶然性とヒューリスティックスです、私は知りたくありません。あなたはインクリメンタルキーを持っているかもしれません、あるいは統計の誤算さえ...geqoが関連するテーブルのクラスタを生成すると、そのクラスタを使用する亜種がおそらく優先されます。 (進化に勝つ)。私の助言:ちょうどあなたのクエリの(固体サブクエリー)部分をCTEに分割します。 – wildplasser

関連する問題