У меня есть таблица с многоколоночным индексом, и я сомневаюсь в правильной сортировке индексов, чтобы получить максимальную производительность по запросам.
Сценарий:
PostgreSQL 8.4, таблица с около миллиона строк
Значения в столбце c1 могут иметь около 100 различных значений . Мы можем предположить, что значения распределены равномерно, поэтому у нас есть около 10000 строк для каждого возможного значения.
Столбец с2 может иметь 1000 различных значений . У нас есть 1000 строк для каждого возможного значения.
При поиске данных условие всегда включает значения для этих двух столбцов, поэтому таблица имеет многоколонный индекс, объединяющий c1 и c2. Я читал о важности правильного упорядочения столбцов в многоколоночном индексе, если у вас есть запросы, использующие только один столбец для фильтрации. Это не так в нашем сценарии.
У меня такой вопрос:
Учитывая тот факт, что один из фильтров выбирает гораздо меньший набор данных, могу ли я улучшить производительность, если первый индекс является наиболее селективным (тот, который позволяет меньший набор)? Я никогда не рассматривал этот вопрос, пока не увидел графику из ссылочной статьи:
Изображение взято из ссылочной статьи о многоколоночных индексах .
В запросах для фильтрации используются значения из двух столбцов. У меня нет запросов, использующих только один столбец для фильтрации. Все они являются WHERE c1=@ParameterA AND c2=@ParameterB
. Есть также такие условия:WHERE c1 = "abc" AND c2 LIKE "ab%"
источник
Если, как вы говорите, запросы, включающие эти 2 столбца, являются проверками равенства обоих столбцов, например:
не заморачивайся с этим. Я сомневаюсь, что будет какая-то разница, и если она будет, она будет незначительной. Конечно, вы всегда можете проверить свои данные и настройки сервера. Различные версии СУБД могут вести себя немного по-разному в отношении оптимизации.
Порядок внутри индекса будет иметь значение для других типов запросов, имеющих проверки только для одного столбца, или условия неравенства, или условия для одного столбца, и группировки для другого, и т. Д.
Если бы я выбрал один из двух заказов, я бы предпочел поставить менее избирательный столбец первым. Рассмотрим таблицу со столбцами
year
иmonth
. Более вероятно, что вам нужноWHERE year = 2000
условие или аWHERE year BETWEEN 2000 AND 2013
или аWHERE (year, month) BETWEEN (1999, 6) AND (2000, 5)
.Можно запросить запрос типа
WHERE month = 7 GROUP BY year
(Найти людей, родившихся в июле), но будет реже. Это зависит, конечно, от фактических данных, хранящихся в вашей таблице. Выберите один заказ на данный момент, скажите,(c1, c2)
и вы всегда можете добавить другой индекс позже(c2, c1)
.Обновление после комментария ОП:
Этот тип запроса, если точно условие диапазона для
c2
столбца и будет нуждаться в(c1, c2)
индексе. Если у вас также есть запросы обратного типа:тогда было бы хорошо, если бы у вас был
(c2, c1)
индекс.источник