2017-02-14 98 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'。想一想 - *另一个领域的所有不同*值都必须被识别,以及索引如何在那里帮助?这需要对整个表进行顺序扫描或索引扫描,并且表扫描通常在那里更便宜。 –