1

シンプルSELECTですが、条件は日付の年のみです。元。:

SELECT * FROM project WHERE project_reg = '2013';

project_regタイプtimestampです。返されるエラーは「構文が無効です」です。

エラー:la sintaxis de entradanoesválidaparatipoタイムスタンプ:«2013»

4

2 に答える 2

4
SELECT * 
from project 
where extract(year from project_reg) = 2013
于 2013-01-11T16:32:28.417 に答える
3

テーブルが小さい場合、またはパフォーマンスが重要でない場合、@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違いを測定するために、インデックスを使用してクエリをテストし、インデックスを使用せずにクエリをテストします。

于 2013-01-11T19:52:39.483 に答える