Как определить, когда таблица Postgres была кластеризована и какие индексы использовались - PullRequest
0 голосов
/ 14 ноября 2018

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

Я знаю, что кластеризацию необходимо перестраивать, если после кластеризации изменяется таблица или раздел, но еслиКогда я последний раз кластеризовал таблицу, я отметил, как я могу узнать, когда мне нужно сделать это снова?

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

SELECT *
FROM   pg_class c
JOIN   pg_index i ON i.indrelid = c.oid
WHERE  relkind = 'r' AND relhasindex AND i.indisclustered 

Мои вопросы.

  • Как узнать, какие индексы были кластеризованы?
  • Есть ли способ точно определить, когда таблицапоследний раз кластеризовался?
  • Как определить, является ли кластеризованный индекс все еще «действительным», или, другими словами, как определить, насколько сильно изменились таблица / индекс, и мне нужно перестроить кластер?.

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


ОБНОВЛЕНИЕ для ясности (я надеюсь)

Если я использую эту команду ....

CLUSTER tableA USING tableA_idx1;
  • Как узнать позже, на какой индекс ссылались, например на tableA_idx1 (для таблицы определено несколько индексов)?
  • Записано ли оно где-нибудь , когда эта команда была выполнена?
  • Я знаю, что, возможно, потребуется перестроить / обновить / воссоздать кластер (не уверен в правильной фразеологии), иногда используя CLUSTER tableA , когда таблица подвергается изменениям.Есть ли способ узнать, когда таблица изменилась настолько, что кластеризация больше не помогает?

1 Ответ

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

Чтобы узнать, какой индекс последний раз использовался для кластеризации таблицы, используйте системный каталог pg_index.

Запросите таблицу для всех индексов, которые принадлежат вашей таблице, и посмотрите, какой из нихимеет indisclustered установлен.Таблица может быть кластеризована только по одному индексу за раз.

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

Чтобы найти это, запросите строку pg_stats для столбца, по которому вы кластеризовались.Если correlation близко к 1, вы все еще в порядке.Чем меньше значение, тем больше указывается кластеризация.

...