Как лучше создать индексы в таблице?

xPro
Дата: 17.03.2015 19:12:11
Есть такая таблица:

CREATE TABLE tbl
(
  f1 bigint,
  f2 bigint,
  f3 bigint,
  f4 bigint,
  f5 bigint,
  date timestamp with time zone,
  value double precision
)


Из неё выборка поля value с group by по полям f1 -f5, date. + может быть условие в where для фильтрации данных. Набор полей в group by и where может быть произвольным.

Как лучше создать индексы к такой таблице?
селективный кластеризатор фактор
Дата: 17.03.2015 19:24:51
xPro,

индекс полезен, если по условию на его поля отбирается малое количество страниц таблицы.
чтобы выбрать индексы нужно анализировать распределение данных и характер запросов.
Maxim Boguk
Дата: 18.03.2015 02:45:23
xPro
Есть такая таблица:

CREATE TABLE tbl
(
  f1 bigint,
  f2 bigint,
  f3 bigint,
  f4 bigint,
  f5 bigint,
  date timestamp with time zone,
  value double precision
)


Из неё выборка поля value с group by по полям f1 -f5, date. + может быть условие в where для фильтрации данных. Набор полей в group by и where может быть произвольным.

Как лучше создать индексы к такой таблице?


Никакие в общем случае. Для запросов без where индексы скорее всего использованы не будут так как всеравно таблицу всю перебирать. Индексы для ускорения поиска каких то данных а не для ускорения запросов перебирающих всю таблицу.

--Maxim Boguk
www.postgresql-consulting.ru
xPro
Дата: 19.03.2015 06:30:43
Maxim Boguk,

Так where как раз и будет в большинстве сценариев.
Maxim Boguk
Дата: 19.03.2015 07:22:37
xPro
Maxim Boguk,

Так where как раз и будет в большинстве сценариев.


тогда от where условий и надо строить индексы а не от group by.

--Maxim Boguk
www.postgresql-consulting.ru
xPro
Дата: 19.03.2015 08:07:37
Maxim Boguk,

Я не говорю, что от group их хочу создать. Просто описал возможные сценарии.
В where может быть любой набор полей, поэтому и вопрос, как индексы создать для такого случая?
Maxim Boguk
Дата: 19.03.2015 08:15:10
xPro
Maxim Boguk,

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


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

Или
1)жестко задаются возможные наборы условий и под них создаются индексы
или
2)набирается статистика наиболее популярных запросов и под них создаются индексы (смиряясь с тем что редкие запросы будут тормозить)

Я бы для начала сделал бы индексы по f1-f5 и date а дальше по фактической нагрузке и использованию решал.

--Maxim Boguk
www.postgresql-consulting.ru
Ivan Durak
Дата: 19.03.2015 10:04:00
Maxim Boguk
Я бы для начала сделал бы индексы по f1-f5 и date а дальше

зачем?
этта
Дата: 19.03.2015 11:36:09
Ivan Durak
Maxim Boguk
Я бы для начала сделал бы индексы по f1-f5 и date а дальше

зачем?

(date);
(f1,date);
(f2,date);
(f3,date);
(f4,date);
(f5,date);

для условий вида
WHERE fn IN(..) AND date BETWEEN

обычно таки именно такого плана запросы предполагаются.

для остальных выборок по началу -- bitmap index scan-ы [т.н. фоксовский rushmore]
если же популярен набор вида
WHERE bool_AND(fi =vi) AND date between <<>>
с фиксированным набором
то можно подшаманить более сложносоставными индексами. главное знать -- насколько всё плохо.

собрать статистику, всё лишнее снести

есть идиотская идея -- сделать btree_gist на ((ARRAY[f1..f5]), date) или даже на( hstore(f1..fn),date) -- в некоторых случаях может проканать модифицировать условия фильтра так, чтобы предвыборка шла по этому хитровыстроенному индексу, а точный фильр -- по изначальному, не модифицированному условию. (смотреть надо на условия, в их многообразии)

для группбая же по всей массе -- ничего не годно. только материализация. (там какие-то словеса можно гребсти про грануляцию, и т.п.)
Maxim Boguk
Дата: 19.03.2015 12:58:29
Ivan Durak
Maxim Boguk
Я бы для начала сделал бы индексы по f1-f5 и date а дальше

зачем?


минимальный набор более менее покрывающий наиболее вероятные на мой взгляд из всех возможных where
когда неизвестно какие именно условия будут самые популярные в начале лучше не пытаться составные индексы придумывать

--Maxim Boguk
www.postgresql-consulting.ru