SQL: индексируйте столбец «по порядку», когда в запросе также много предикатов «где»

#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 предикаты индексируются таким образом, что значительно сокращаются строки, подлежащие сканированию или сортировке. Однако вы можете индексировать несколько столбцов; таким образом, индекс on col1, 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 условий равенства будет довольно необычно, чтобы ожидаемое количество оставшихся строк было достаточно большим, чтобы индекс казался стоящим.