Postgresql - запрос всех строк временных рядов в таблице - PullRequest
0 голосов
/ 06 сентября 2018
SELECT * FROM table_1 ORDER BY time;

Приведенный выше запрос будет запрашивать все строки, находящиеся в table_1, при сортировке всех строк по столбцу time. Однако если размер таблицы получит миллионы строк, выборка всех строк в таблице будет неэффективной с добавлением ORDER BY time. К счастью, у меня есть таблица временных рядов, в которой используется расширение TimescaleDB, и все строки вставляются своевременно.

В этом случае, какой будет наиболее эффективный способ извлечения всего из таблицы, при этом гарантируя, что результирующий запрос упорядочен по time?

Должен ли я просто удалить ORDER BY time? Если я уберу это, могу ли я быть уверен, что результирующий запрос ВСЕГДА будет иметь порядок time?

Кроме того, я слышал, что у PostgreSQL есть некоторые проблемы с драйверами при извлечении всех строк в таблице, потому что он оптимизирован для запроса небольшой части данных в таблице. Как я могу оптимизировать производительность?

1 Ответ

0 голосов
/ 06 сентября 2018

Невозможно обеспечить порядок набора данных, возвращаемых оператором SELECT, без использования явного предложения ORDER BY; это верно, даже если данные хранятся в таблице упорядоченным образом. Если вам необходимо упорядочить данные, безопаснее всего определить предложение ORDER BY.

Запуск SELECT * против TimescaleDB Hypertable не будет эффективным. TimescaleDB хранит данные в виде фрагментов в гипертаблице. Идея состоит в том, что вы привязываете запрос к определенному времени так, чтобы он совпадал с одним конкретным фрагментом, что приводит к оптимальной производительности. Когда вы запускаете запрос, который должен поразить все записи в таблице, теперь он должен просмотреть все данные, содержащиеся во всех чанках, и единственный способ сделать это - через последовательное сканирование.

Это приводит к вашему вопросу о PostgreSQL и получении всех строк. PostgreSQL использует параллельное последовательное сканирование, когда большая часть таблицы будет поражена запросом. Хотя это даст лучшую производительность, чем последовательное сканирование по одному кадру, оно все же не будет таким быстрым, как сканирование по индексу, извлекающее подмножество данных, будет сопоставлено с той же таблицей.

В чем причина необходимости запрашивать все строки в таблице? В силу того, что любой механизм SQL должен был бы просматривать каждую строку хотя бы один раз, чтобы гарантировать, что все строки возвращены, нет никакого способа, которым SELECT * когда-либо сможет использовать преимущества поиска, связанные с хешированием и индексации.

...