Влияние кластера на производительность

8

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

У меня есть timestampстолбец, но в основном я спрашиваю о каком-то дне, поэтому я создал индекс timestampдля dateанализа:

CREATE INDEX foo_my_timestamp_idx
ON foo
USING btree
((my_timestamp::date) DESC);

Теперь, чтобы увеличить производительность, я CLUSTER fooиспользую таблицу, указанную выше:

CLUSTER foo USING foo_my_timestamp_idx;

Согласно руководству по SQL-CLUSTER , таблица

физически переупорядочен на основе информации индекса

Интересно, влияет ли это на производительность для других запросов, использующих PK таблицы (скажем id_foo). Есть ли минусы?

ilovkatie
источник

Ответы:

10

Да, могут быть и минусы. Если другой запрос просматривает другой сегмент данных, не определенный по дате, это может привести к снижению производительности, если строки теперь распределены по большему количеству страниц данных. Точно так же, как ваш первый запрос прибыли. Это полностью зависит от информации не в вашем вопросе.

другие запросы, использующие PK таблицы (скажем, id_foo)

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

Имейте в CLUSTERвиду, что перезаписывает таблицу в первоначальном состоянии, как это VACUUM FULLделает (удаляет мертвые кортежи, сжимает физический размер таблицы, переписывает индексы). Таким образом, вы можете сразу увидеть положительный эффект на производительность чтения независимо от порядка сортировки. (Как и в случае с вами VACUUM FULL.)
После CLUSTERэтого вы, возможно, захотите запустить простую VACUUMтаблицу, чтобы обновить карту видимости , что может разрешить сканирование только по индексу.

Все преимущества CLUSTERсжатия с частотой записи.

Кроме того, если у вас много обновлений в таблице, это CLUSTERможет существенно снизить производительность записи, удалив «пространство для маневра» для обновлений HOT на той же странице данных. Вы могли бы противостоять этому эффекту с FILLFACTORнастройкой ниже 100. Опять же, это зависит от местоположения обновленных строк и т. Д.

Связанные с:

В любом случае, я бы, вероятно, не включал индексирование и кластеризацию my_timestamp::date, а включал my_timestampнапрямую. Ничего не потеряно, что-то получено. Актерский состав очень дешевый, но все равно дешевле его не использовать. И индекс может поддерживать больше запросов.

CREATE INDEX foo_my_timestamp_idx ON foo (my_timestamp);

Несмотря на то , dateзанимает всего 4 байта на диск и timestampзанимает 8 байт, разница , как правило , теряются для выравнивания прокладки для вашего случая, и оба индекса имеет точно такой же размер.

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

Я также отбросил DESCключевое слово, поскольку Postgres может читать индексы задом наперед практически так же быстро, как и вперёд. (Порядок сортировки имеет значение для многоколоночных индексов!) Подробнее:

Вместо:

SELECT * FROM foo
WHERE my_timestamp::date = '2016-07-25';

Вы бы теперь использовали:

SELECT * FROM foo
WHERE  my_timestamp >= '2016-07-25'  -- this is a timestamp literal now
WHERE  my_timestamp <  '2016-07-26';

Та же производительность.

Если вам не нужен компонент времени колонок на всех , преобразовать столбец в date...

Как откатиться CLUSTER?

CLUSTERДля одной таблицы можно выполнить откат, ROLLBACKкак и для любой другой обычной команды, если транзакция не была зафиксирована.

Тем не менее, я цитирую руководство :

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

Вы всегда можете запустить CLUSTERс другим индексом, чтобы еще раз изменить физический порядок строк.

Эрвин Брандштеттер
источник
Потрясающий ответ, мне нужно спросить тогда, как сделать «откат» CLUSTER? Нужно ли мне сейчас CLUSTERиспользовать ПК?
ilovkatie
@ilovkatie: я добавил немного, как откатиться.
Эрвин Брандштеттер,