Создание индекса в направлениях asc и desc

8

За последние несколько недель я бушевал против старой базы данных Firebird. Эта база данных является дерьмовой для всех видов причин, но одна вещи , которую я заметил, что каждое поле из каждой таблицы имеет два индекса; каждый с одним сегментом, один в ascпорядке и один в descпорядке.

Помимо веса наличия индекса для каждого поля в каждой таблице, это заставило меня задуматься - есть ли преимущество для односегментных индексов в наличии двух индексов с одинаковыми сегментами индекса, но один в descи один в asc? Есть ли что-то, что можно получить, или современная СУБД просто использует ascиндекс и начинает с конца и, если потребуется, работает в обратном направлении?

Марк Хендерсон
источник

Ответы:

5

Хотя индексы Firebird в теории являются двунаправленными, движок фактически не использует двунаправленность, потому что обратное направление не заслуживает доверия из-за порядка записи страниц: когда страница индекса разделяется, ссылки между страницами переписываются, если это чередуется с при обратном чтении он может прочитать ссылку, которая все еще указывает на старую страницу индекса, а не на вновь добавленную страницу, в результате чего он пропускает записи индекса. Это объясняется в Firebird для эксперта по базам данных: Эпизод 3 - На согласованности дисков .

Так как двунаправленность индекса не гарантируется, Firebird читает индекс только в объявленном направлении (по возрастанию или по убыванию). Теперь, что касается того, почему в вашей базе данных есть все эти индексы, я бы предположил, что либо человек, проектирующий базу данных, не знал, что делает, либо предполагал, что добавление этих индексов ускорит сортировку по любому столбцу.

Марк Роттвил
источник
4

Да, в большой таблице наблюдается заметное снижение производительности (FB 2.5), когда не используется нисходящий индекс для:

select first 1 * 
from mytable 
where pk_id >= 200000 
order by pk_id desc

Этот запрос используется для поиска предыдущей записи на основе значения поля первичного ключа "pk_id" (Integer).

Рой Дамман
источник
Postgres определенно имеет эту проблему
PirateApp