2017-02-14 16 views
0

Я собираю таблицу, используя поле идентификатора файла. Каждый файл имеет имя, которое соответствует точно одному (его) идентификатору файла.Postgres «первая» функция агрегации

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

Поскольку я знаю структуру таблицы, я знаю, что мне нужен ЛЮБОЙ полный путь. Минимальные и максимальные ок, но это требует много времени.

Я натолкнулся на функцию агрегации this, которая возвращает первое значение. К сожалению, эта функция занимает много времени, поскольку она сканирует всю таблицу. Например, это очень медленно:

select first(file_id) from table; 

Что это самый быстрый способ сделать это? С функцией агрегации или без нее.

+0

Для первого запроса попробуйте 'select different on (file_key), file_key, fullfilepath из the_table order by file_key, fullfilepath' - 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 имеет). – pozs

+0

Это означает, что вы можете использовать индекс для 'SELECT min (field) FROM atable', но не для' SELECT min (field) FROM atable GROUP BY anotherfield'. Подумайте об этом - нужно идентифицировать все разные значения 'anotherfield' и как там может помочь индекс? Для этого требуется последовательное или индексное сканирование по всей таблице, и сканирование таблицы обычно там дешевле. –