2017-02-14 96 views
0

我聚集了一個使用文件ID字段的表。每個文件都有一個與其(一個)文件ID完全匹配的名稱。Postgres「第一個」聚合函數

select file_key, min(fullfilepath) 
from table 
group by file_key 

因爲我知道表的結構,我知道我需要任何fullfilepath。最小和最大值都可以,但需要很長時間。

我遇到了this聚合函數,它返回第一個值。不幸的是,這個函數需要很長時間,因爲它掃描整個表格。例如,這是非常緩慢的:

select first(file_id) from table; 

什麼是最快的方法來做到這一點?有或沒有聚合功能。

+0

對於第一個查詢,請嘗試'通過file_key,fullfilepath'選擇獨立於(file_key),file_key,來自the_table順序的完整文件路徑 - that _might_會比'group by'更快 –

回答

1

有沒有辦法讓你的第一個查詢與GROUP BY子句更快,因爲它掃描整個表來查找所有組。

你的第二個查詢可以進行得更快:

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具有)時,PostgreSQL可以優化(並使用索引) )。 – pozs

+0

這意味着您可以使用'SELECT min(field)FROM atable'的索引,但不能用於'SELECT min(field)FROM atable GROUP BY anotherfield'。想一想 - *另一個領域的所有不同*值都必須被識別,以及索引如何在那裏幫助?這需要對整個表進行順序掃描或索引掃描,並且表掃描通常在那裏更便宜。 –