2016-10-29 2 views
0

У меня есть несколько таблиц с примерно 17-миллиметровыми строками, в которых есть столбец даты, который я бы хотел использовать часто для поиска. Я рассматриваю возможность просто указать индекс в столбце и посмотреть, как идут вещи или сортировать элементы по дате как одноразовую операцию, а затем вставлять все в новую таблицу, чтобы первичный ключ поднимался по мере того, как поднималась дата.Рекомендуемый способ индексирования поля даты в postgres?

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

Конечная цель заключается в том, чтобы загружать sql-запросы в pandas для некоторого анализа, если это имеет значение здесь.

+0

Просто создайте его одновременно в первый раз, чтобы даже идти, требуется некоторое время, чтобы он не мешал перфу. – Phill

ответ

1

Индекс на колонке дата имеет смысл, когда вы собираетесь искать таблицу для заданной даты (ы), например:

select * from test 
where the_date = '2016-01-01'; 
-- or 

select * from test 
where the_date between '2016-01-01' and '2016-01-31'; 
-- etc 

В этих запросах есть независимо от того, является ли порядок сортировки первичного ключ и столбец даты совпадают или нет. Следовательно, переписывание данных в новую таблицу будет бесполезным. Просто создайте индекс.

Однако, если вы собираетесь использовать индекс только в ORDER BY:

select * from test 
order by the_date; 

затем ключевой индекс первичного целое число может быть значительно (в 2-4 раза) быстрее, чем индекс на колонке даты.

+0

Спасибо. Мне показалось, что добавление индекса в поле даты ускорит порядок, так что это прояснилось для меня. С другой стороны, похоже, что увеличение первичных ключей в тандеме с полем даты будет более универсальным в том, что я получаю заказ по производительности, а также возможность косвенно запрашивать диапазоны дат, пока у меня есть общая идея, какие ID-карты сказать первый день в месяц. – massphoenix

+0

Ну, такое дополнительное искусственное индексирование возможно, но оно кажется слишком сложным и непрактичным. Фактически, обычный индекс значительно улучшает производительность и должен быть достаточным. – klin

+0

Но что делать, если я использую запросы для удаления, например WHERE date_added> now() - '1 month'? Является ли индекс полезным в этом случае? Thnx – Sonique

2

Postgres поддерживает некоторые расширенные кластерные индексы, которые вы предлагаете, удаляя и повторно вставляя данные.

Фактически удаление и повторная установка данных в том порядке, в котором вы хотите, не изменит время выполнения запроса. Postgres не знает порядок данных.

Если вы знаете, что данные таблицы не изменяются. Затем скопируйте данные на основе создаваемого вами индекса.

Эта операция переупорядочивает таблицу в соответствии с порядком в индексе. Это очень эффективно, пока вы не обновите таблицу. Синтаксис:

CLUSTER tableName USING IndexName; 

См the manual подробности.

Я также рекомендую использовать

explain <query>; 

для сравнения двух запросов, до и после того, как индекс. Или до и после кластеризации.

Смежные вопросы