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

У меня есть таблица, которая включает многостолбцовый индекс, определенный как

CREATE INDEX tab_a_idx1 ON tab_a USING btree (device, fixtime)

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

WHERE device = 'xyz' AND fixtime > 'sometime' AND fixtime <= 'someothertime' ORDER BY fixtime;

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

CLUSTER tab_a USING tab_a_idx1;

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

SELECT c.oid, c.relname as tablename, x.relname as indexname, z.indexdef
FROM   pg_class c
JOIN   pg_index i ON i.indrelid = c.oid
JOIN   pg_class x ON i.indexrelid = x.oid
JOIN   pg_indexes z ON x.relname = z.indexname
WHERE  c.relkind = 'r' AND c.relhasindex AND i.indisclustered 

И я использовал таблицу pg_stats , чтобы проверить корреляциюиндексированные столбцы.

В цитируемом ответе говорится, что корреляция, близкая к '1, является хорошей, и чем ниже значение, тем больше кластеризация указывается.

Сразу после кластеризации таблицыкорреляция 1-го поля в индексе (устройство) была низкой (0,008), а 2-го (фиксированное время) относительно высокой (0,994).

  • Если эти значения suПредполагается, что он близок к «1», но не означает ли это, что таблица не может (или не должна) быть кластеризована по многостолбцовому индексу?
  • Существует несколько версий tab_a (он разделен на время исправления), и я заметил, что значения корреляции, по-видимому, не сильно различаются между кластерной и некластеризованной версиями таблицы.Означает ли это, что нет смысла кластеризовать этот индекс?

Спасибо


ОБНОВЛЕНИЕ - родительская таблица была создана следующим образом ....

CREATE TABLE tab_a 
  ( device  CHAR(6),
    fixTime TIMESTAMP,
    ....lots more fields.....
  )
PARTITION BY RANGE (fixTime);

Отдельные разделы были созданы следующим образом

CREATE TABLE tab_a_201704 PARTITION OF tab_a FOR VALUES FROM ('2017-04-01' ) TO (  '2017-05-01' )

И индекс, используемый для кластеризации, как этот ....

CREATE INDEX tab_a_201704_idx2 ON tab_a_201704 (device, fixTime);

И команда для создания кластера ....

CLUSTER tab_a_201704 USING tab_a_201704_idx2 ;
...