declarative partitioning(w00t!)を使用して、テーブルを日付範囲(1年間は私の場合)でパーティション化しています。Postgresが日付範囲パーティションをフィルタリングしないのはなぜですか?
私はテーブル - SELECT * FROM tbl WHERE date > date '2016-01-01'
に対してクエリを実行すると、意図したとおりに動作します。新しいデータを含むテーブルだけがスキャンされます。
変数または関数(CURRENT_DATE
、NOW()
など)を使用して日付を指定すると、EXPLAIN
はすべてのパーティションをスキャンします。意図したとおりに動作し
もの:不必要なすべてのパーティションをスキャン
SELECT * FROM tbl WHERE date > date '2016-01-01'
--
SELECT * FROM tbl WHERE date > '2016-01-01'::date
もの:私は他の比較演算子と同じ振る舞いを取得
SELECT * FROM tbl WHERE date > CURRENT_DATE
--
SELECT * FROM tbl WHERE date > NOW()
--
SELECT * FROM tbl WHERE date > (NOW() - 365)::date
--
SELECT * FROM tbl WHERE date > (SELECT (NOW()::date - 365)::date AS d)
-- Even CTEs are no dice:
WITH a AS (SELECT CURRENT_DATE AS d)
SELECT * FROM tbl, a WHERE date > a.d
-- Same with JOINs
SELECT w.*
FROM (CURRENT_DATE - 365 as d) a
LEFT JOIN wtf w ON w.date > a.d
..etc
から=
を、 <
など
私はフィールド上にidxは必要ないと言っています(私はとにかくそうしません)。私はちょうどのために1つを追加し、それは役に立たなかった。
なぜこのようなことが起こりますか(単純なクエリに複雑化を加えることなく)できればどうしたらいいですか?
してください** [EDIT]に
RETURNS setof text
へRETURNS setof tbl
とSELECT...
を変更することによって、あなたの質問にこれをテストし、 'CREATE TABLEを追加することができます。機能は最高っぽい選択肢であると思われます'文(すべてのインデックスを含む)と** explain(analyze、verbose)を使用して生成された実行計画**を使用します。 [**フォーマットされたテキスト**](http://stackoverflow.com/help/formatting)、[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-may-i-not -with-upload-on-code-on-so-asking-a-question/285557#285557) –これは、実行するまでplannerがnow()の出力を知らないためです。 – JustMe
ありがとう@JustMe - これを回答として投稿して、不要なSQLとEXPLAINの出力を取り除いてこれを他の人にも役立てますか? – onwsk8r