Тайм-аут запросов для больших индексированных таблиц - PullRequest
0 голосов
/ 16 января 2019

Я относительно новичок в использовании Postgres, но мне интересно, какой здесь может быть обходной путь.

У меня есть таблица с примерно 20 столбцами и 250 миллионами строк, и индекс, созданный для столбца отметки времени time (но без разделов).

Запросы, отправленные в таблицу, не выполнялись (хотя с помощью функции просмотра первых / последних 100 строк в PgAdmin работает) и выполняются бесконечно.Даже простые select * запросы.

Например, если я хочу ограничить выбор данных до 10

SELECT * from mytable
WHERE time::timestamp < '2019-01-01'
LIMIT 10;

Такой запрос зависает - что можно сделать для оптимизации запросов встол такой большой?Когда таблица имела меньший размер (~ 100 миллионов строк), запросы всегда выполнялись.Что делать в этом случае?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Если time относится к типу данных timestamp или индекс создан на (time::timestamp), запрос должен быть быстрым как молния.

Пожалуйста, покажите оператор CREATE TABLE и CREATE INDEX и вывод EXPLAIN для запроса для получения дополнительной информации.

0 голосов
/ 16 января 2019

«Запрос, который не завершен» обычно означает, что он выполняет замену диска. Особенно, если упомянуть тот факт, что с 100M строк это удается завершить. Это потому, что индекс для 100M строк все еще умещается в вашей памяти. Но индекс вдвое больше, чем этот размер.

Ограничение здесь не поможет, поскольку база данных, вероятно, решит сначала прочитать индекс, и это его убивает.

Вы можете попытаться увеличить доступную память, но на самом деле лучшим решением здесь будет разбиение.

Разделение означает меньшие таблицы. Меньшие таблицы означают меньшие индексы. Меньшие индексы имеют больше шансов вписаться в вашу память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...