Criando um índice nas direções asc e desc

8

Nas últimas semanas, estive furioso com um antigo banco de dados do Firebird. Esse banco de dados é péssimo por todos os tipos de razões, mas notei que cada campo de cada tabela possui dois índices; cada um com um único segmento, um em ascordem e um em descordem.

Além da questão de ter um índice para todos os campos de todas as tabelas, isso me fez pensar - existe alguma vantagem para índices de segmento único ter dois índices com os mesmos segmentos de índice, mas um em descum e um em asc? Há algo a ser ganho, ou um DBMS moderno simplesmente usaria o ascíndice e começaria do final e retornaria, se necessário?

Mark Henderson
fonte

Respostas:

5

Embora os índices do Firebird sejam, em teoria, bidirecionais, o mecanismo não usa a bidirecionalidade porque a direção reversa não é confiável devido à ordem de gravação das páginas: quando uma página de índice é dividida, os links entre as páginas são reescritos, se isso se intercalar com uma leitura reversa, pode ler um link que ainda está apontando para a página de índice antiga, em vez da página recém-adicionada, fazendo com que ela ignore as entradas de índice. Isso é explicado no Firebird para o especialista em banco de dados: Episódio 3 - Consistência no disco .

Portanto, como a bidirecionalidade do índice não é garantida, o Firebird apenas lê um índice na direção declarada (ascendente ou descendente). Agora, por que o seu banco de dados tem todos esses índices, eu suponho que a pessoa que criou o banco de dados não sabia o que estava fazendo ou assumiu que a adição desses índices tornaria a classificação de qualquer coluna mais rápida.

Mark Rotteveel
fonte
4

Sim, há um desempenho notável atingido (FB 2.5) em uma tabela grande quando não estiver usando um índice descendente para, por exemplo:

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

Esta consulta é usada para localizar o registro anterior, com base no valor do campo de chave primária "pk_id" (Inteiro).

Roy Damman
fonte
postgres definitivamente tem esse problema
PirateApp