Nas últimas semanas, tenho me revoltado contra um antigo banco de dados Firebird. Esse banco de dados é ruim por vários motivos, mas uma coisa que notei foi que cada campo de cada tabela possui dois índices; cada um com um único segmento, um em asc
ordem e outro em desc
ordem.
Além do wtf'ness de ter um índice para cada campo em cada tabela, isso me fez pensar - há alguma vantagem para índices de segmento único em ter dois índices com os mesmos segmentos de índice, mas um dentro desc
e outro dentro asc
? Existe algo a ser ganho ou um DBMS moderno usaria o asc
índice e começaria do final e trabalharia de trás para frente, se necessário?
Eu ficaria surpreso ao saber de um banco de dados moderno que não pode fazer varreduras de índice de ordem reversa.
Embora os índices Firebird sejam em teoria bidirecionais, o mecanismo não usa a bidirecionalidade porque a direção inversa 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 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 ele ignore as entradas do índice. Isso é explicado em Firebird for the Database Expert: Episode 3 - On Disk Consistency .
Assim como a bidirecionalidade do índice não é garantida, o Firebird apenas lê um índice em sua direção declarada (ascendente ou descendente). Agora, quanto ao motivo de seu banco de dados ter todos esses índices, presumo que a pessoa que projetou o banco de dados não sabia o que estava fazendo ou presumiu que adicionar esses índices tornaria a classificação em qualquer coluna mais rápida.
Sim, há um impacto perceptível no desempenho (FB 2.5) em uma tabela grande quando não se usa um índice descendente, por exemplo:
Esta consulta é utilizada para localizar o registro anterior, com base no valor do campo de chave primária "pk_id" (Integer).