シンプルSELECT
ですが、条件は日付の年のみです。元。:
SELECT * FROM project WHERE project_reg = '2013';
project_reg
タイプtimestamp
です。返されるエラーは「構文が無効です」です。
エラー:la sintaxis de entradanoesválidaparatipoタイムスタンプ:«2013»
シンプルSELECT
ですが、条件は日付の年のみです。元。:
SELECT * FROM project WHERE project_reg = '2013';
project_reg
タイプtimestamp
です。返されるエラーは「構文が無効です」です。
エラー:la sintaxis de entradanoesválidaparatipoタイムスタンプ:«2013»
SELECT *
from project
where extract(year from project_reg) = 2013
テーブルが小さい場合、またはパフォーマンスが重要でない場合、@Clodoaldo の回答は問題なく機能します。
それ以外の場合は、次のより洗練された形式をお勧めします。
SELECT *
FROM project
WHERE project_reg >= '2013-01-01 0:0'
AND project_reg < '2014-01-01 0:0'
条件が式( など)をチェックする場合extract(year from project_reg)
、最も基本的な形式のみがクエリ オプティマイザーによって書き換えられ、そのままテーブル列に適用されます。これはできません。
それ以外の場合、Postgres は、条件を適用する前に、テーブル内のすべての行の式を評価する必要があります。さらに、基本的なインデックスを使用することはできません。これにより、テーブル全体のスキャンが行われ、インデックス スキャンのコストが大幅に削減されます。
これにより、大きなテーブルに対するクエリが非常に高価になる可能性があります。ここでは桁違いの話をしています。
これを回避するには、次のことができます。
式にインデックスを作成する
CREATE INDEX project_project_reg_year_idx
ON project (extract(year FROM project_reg)::int);
あなたはおそらくそれをまだ持っていません。
結果を にキャストする方法に注意してくださいinteger
。これは、 によって返される倍精度よりも「年」に適していextract()
ます。クエリで同じ式を使用します。
欠点: このようなインデックスはかなり特殊化されており、式の一致にのみ使用できます。ほとんどの場合、多くの目的で基本的なインデックスが適しています。
テーブル列を直接確認できるように、条件を書き直してください。できれば。
幸いなことに、できます。それが私の提案するクエリが行うことです。このようにして、単純なインデックスを利用できます。
CREATE INDEX project_project_reg_idx ON project (project_reg);
あなたはおそらくすでにそれを持っています。少なくとも、おそらくそうすべきです。
EXPLAIN ANALYZE
違いを測定するために、インデックスを使用してクエリをテストし、インデックスを使用せずにクエリをテストします。