2017-02-14 7 views
0

集計ファイルIDフィールドを使用するテーブルです。各ファイルには、正確に1つのファイルIDに一致する名前が付いています。Postgres "first"集約関数

私はテーブルの構造を知っているので、私はすべてのフルファイルパスが必要であることを知っています。最小値と最大値は大丈夫ですが、多くの時間が必要です。

最初の値を返すthis集約関数を見つけました。残念ながら、この関数はテーブル全体をスキャンするため、時間がかかります。たとえば、これは非常に遅いです:

select first(file_id) from table; 

これを行う最も速い方法は何ですか?集約機能の有無にかかわらず。

+0

最初のクエリの場合は、(file_key)、file_key、file_key、fullfilepathの順でfull_file_keyを選択してください。より速い場合は 'group by 'より –

答えて

1

にはがあり、すべてのグループを見つけるためにテーブル全体をスキャンするため、GROUP BY句を使用した最初のクエリを高速にする方法はありません。

あなたの2番目のクエリを高速化することができます。

SELECT (
    SELECT file_id FROM "table" 
    WHERE file_id IS NOT NULL 
    LIMIT 1 
); 

は、あなたがそれを書いたように、集計関数は、PostgreSQLへブラックボックスあるので、クエリを最適化する方法はありません。

+0

最後の文は*通常* trueです。しかし、PostgreSQLは、定義された['SORTOP'](https://www.postgresql.org/docs/current/static/sql-createaggregate.html)(min/maxには)。 – pozs

+0

これは、 'SELECT min(field)FROM atable'ではインデックスを使用できますが、' SELECT min(field)FROM atable GROUP BY anotherfield'ではインデックスを使用できないことを意味します。それについて考えてみましょう。*「anotherfield」のすべての異なる*値を特定しなければなりません。インデックスはどのように役立ちますか?そのためには、テーブル全体のシーケンシャルスキャンやインデックススキャンが必要で、通常はテーブルスキャンが安価です。 –