Crear un índice en ambas direcciones asc y desc

8

En las últimas semanas he estado enfurecido contra una vieja base de datos Firebird. Esta base de datos es mala por todo tipo de razones, pero una cosa que noté fue que cada campo de cada tabla tiene dos índices; cada uno con un solo segmento, uno en ascorden y uno en descorden.

Además de la conveniencia de tener un índice para cada campo en cada tabla, me hizo pensar: ¿hay alguna ventaja para los índices de un solo segmento de tener dos índices con los mismos segmentos de índice, pero uno en descy uno en asc? ¿Hay algo que ganar, o un DBMS moderno simplemente usaría el ascíndice y comenzaría desde el final y avanzaría si fuera necesario?

Mark Henderson
fuente

Respuestas:

5

Aunque los índices de Firebird son en teoría bidireccionales, el motor en realidad no usa la bidireccionalidad porque la dirección inversa no es confiable debido al orden de escritura de las páginas: cuando una página de índice se divide, los enlaces entre páginas se reescriben, si esto se intercala con una lectura inversa puede leer un enlace que todavía apunta a la página de índice anterior en lugar de la página recién agregada, lo que hace que omita las entradas de índice. Esto se explica en Firebird para el experto en bases de datos: Episodio 3: Consistencia en el disco .

Entonces, como la bidireccionalidad del índice no está garantizada, Firebird solo lee un índice en su dirección declarada (ya sea ascendente o descendente). Ahora, en cuanto a por qué su base de datos tiene todos estos índices, supongo que la persona que diseñó la base de datos no sabía lo que estaba haciendo, o asumió que agregar estos índices haría que la clasificación en cualquier columna fuera más rápida.

Mark Rotteveel
fuente
4

Sí, hay un impacto notable en el rendimiento (FB 2.5) en una tabla grande cuando no se utiliza un índice descendente para, por ejemplo:

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

Esta consulta se utiliza para buscar el registro anterior, en función del valor del campo de clave principal "pk_id" (Entero).

Roy Damman
fuente
Postgres definitivamente tiene este problema
PirateApp