Creazione di un indice in entrambe le direzioni asc e desc


8

Nelle ultime settimane ho imperversato contro un vecchio database Firebird. Questo database è scadente per una serie di motivi, ma una cosa che ho notato è che ogni singolo campo di ogni singola tabella ha due indici; ognuno con un singolo segmento, uno in ascordine e uno in descordine.

A parte la wtf'ness di avere un indice per ogni campo in ogni tabella, mi ha fatto pensare - c'è qualche vantaggio per gli indici a singolo segmento di avere due indici con gli stessi segmenti di indice, ma uno in desce uno in asc? C'è qualcosa da guadagnare, o un moderno DBMS dovrebbe semplicemente utilizzare l' ascindice e iniziare dalla fine e tornare indietro se necessario?

Risposte:



5

Sebbene gli indici Firebird siano in teoria bidirezionali, il motore in realtà non utilizza la bidirezionalità perché la direzione inversa non è affidabile a causa dell'ordine di scrittura delle pagine: quando una pagina di indice viene divisa, i collegamenti tra le pagine vengono riscritti, se questo si incrocia con una lettura inversa potrebbe leggere un collegamento che punta ancora alla pagina dell'indice precedente anziché alla pagina appena aggiunta, causando il salto delle voci dell'indice. Questo è spiegato in Firebird per l'esperto di database: episodio 3 - Coerenza su disco .

Pertanto, poiché la bidirezionalità dell'indice non è garantita, Firebird legge solo un indice nella direzione dichiarata (crescente o decrescente). Ora sul motivo per cui il tuo database ha tutti questi indici, presumo che o la persona che ha progettato il database non sapesse cosa stesse facendo, o ha ipotizzato che l'aggiunta di questi indici avrebbe reso l'ordinamento su qualsiasi colonna più veloce.


4

Sì, si verifica un notevole aumento delle prestazioni (FB 2.5) su una tabella di grandi dimensioni quando non si utilizza un indice decrescente per esempio:

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

Questa query viene utilizzata per trovare il record precedente, in base al valore del campo chiave primaria "pk_id" (intero).


Postgres ha sicuramente questo problema
PirateApp il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.