#sql #postgresql #indexing
Вопрос:
Предположим, у меня есть этот sql-запрос:
select * from my_table
where col1 = 'abc' and col2 = 'qwe' and ... --e.g. 10 predicates or more
order by my_date desc
Будет ли индекс только по my_date
столбцу вообще использоваться базой данных? Как-то это улучшит производительность?
Меня больше интересуют Постгресы.
Комментарии:
1.Маловероятно, что будет использоваться только
my_date
индекс on, если какие-либоwhere
предикаты индексируются таким образом, что значительно сокращаются строки, подлежащие сканированию или сортировке. Однако вы можете индексировать несколько столбцов; таким образом, индекс oncol1, col2, ..., my_date
может помочьwhere
предложению, а такжеorder by
предложению, и поэтому его можно выбрать для использования.2. В чем заключается кардинальность
col1
..col10
? Почему здесь так много колонок? Нужно ли их индексировать? Какова будет их суммарная мощность?
Ответ №1:
Оптимизатор PostgreSQL будет использовать индекс, если сочтет, что это дешевле, чем выборка строк, соответствующих WHERE
условию, и их сортировка.
Вероятно, это будет тот случай, если:
- таких строк много, и сортировка будет дороже, чем сканирование индекса
- нет никаких индексов для поддержки этого
WHERE
условия
Комментарии:
1. Для внешнего
ORDER BY
оптимизатор имеет несколько степеней свободы. Его спина прижата к стене …2. Ваш ответ, по-видимому, применим к ситуации с ОГРАНИЧЕНИЕМ 1 (или, возможно, очень низким значением cursor_tuple_fraction), но его данный запрос не включал никаких ОГРАНИЧЕНИЙ.
3. @jjanes Ах, вы правы. Я попытался исправить ответ.
Ответ №2:
Без ОГРАНИЧЕНИЙ шансы использования индекса с одним столбцом для обеспечения порядка здесь довольно низки. Действительно, я не могу придумать ситуацию, чтобы сделать это, не забавляясь с enable_sort
или enable_seqsan
.
Даже при ОГРАНИЧЕНИИ после применения 10 условий равенства будет довольно необычно, чтобы ожидаемое количество оставшихся строк было достаточно большим, чтобы индекс казался стоящим.