Я знаю, что внутренним индексом является B-дерево или аналогичная древовидная структура.Предположим, что индекс построен для 3 столбцов (a,b,c)
, я хочу, чтобы Postgres:
- нашел ключ [a = 10, b = 20, c = 30] в этом B-дереве,
- сканировать следующие 10 записей и возвращать их.
Если индекс имеет только один столбец, решение очевидно:
select * from table1
where a >= 10
order by a limit 10
Но если столбцов больше, решение становится намногоболее сложный.Для 2 столбцов:
select * from table1
where a > 10 or (a = 10 and b >= 20)
order by a, b limit 10
3 столбца:
select * from table1
where a > 10 or (a = 10 and (b > 20 or b = 20 and c >= 30))
order by a, b, c limit 10
Обратите внимание, что запрос:
select * from table1
where a >= 10 and b >= 20 and c >= 30
order by a, b, c limit 10
является неверным , поскольку он будетнапример, отфильтровать [a = 11, b = 10, c = 1].
Как я могу сообщить Postgres, что я хочу эту операцию?
И могу ли я быть уверен, что даже для этих сложных запросов для 2+ столбцов оптимизатор всегда поймет, что он должен выполнить сканирование диапазона?Почему?