Обновление времени Postgres на большом столе - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю с очень большой (5,9 миллиардов строк) таблицей в AWS (RDS m4.large), и у меня возникают некоторые проблемы с получением данных до уровня, с которым я могу эффективно работать и выполнять запросы.

Данные имеют временную переменную в секундах с начала записи (тип: bigint), но я хотел бы иметь возможность агрегировать данные на дневном уровне (т. Е. GROUP BY day).

Я начал этот процесс с простого создания столбца дня и обновления таблицы для заполнения поля дня путем преобразования секунд в дни:

ALTER TABLE tbl
ADD COLUMN day INTEGER;

UPDATE tbl
SET day=tbl.eventtime/86400+1;

, который отлично работал в среде тестирования (первые 10 дней 90-дневной записи), но, возможно, неожиданно, он не так хорошо работает с полным набором данных из 5 миллиардов строк.

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

Я понимаю, что другим подходом было бы преобразование времени в секундах в некоторый тип меток времени postgres - но я незнакомые метки времени и не уверен, с чего начать.

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

Пожалуйста, дайте мне знать, если требуется какая-либо дополнительная информация.

1 Ответ

0 голосов
/ 08 ноября 2018

Индексы сильно замедляют изменение данных, но без них невозможно эффективно выполнять поиск по большой таблице.

Итак, искусство в том, чтобы иметь как можно меньше индексов.

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

Если вам нужно выполнить поиск по всем строкам за определенный день, вы можете создать индекс для соответствующего выражения:

CREATE INDEX ON tbl ((eventtime / 86400 + 1));

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

Это полезно только для запроса данных. Если вы хотите эффективно агрегировать, индекс не очень вам поможет. В этом случае вам следует использовать материализованное представление, возможно, такое, которое вы обновляете с помощью триггера.

...