[firebase-br] Índice e operador de menor/maior

Daniel / Tecnobyte temp em tecnobyte.com.br
Sáb Jan 1 11:38:36 -03 2005


Estou fazendo alguns testes por aqui e cheguei a uma situação curiosa. Criei
uma tabela com a estrutura abaixo:

CREATE TABLE Trunca(
  Codigo  INTEGER NOT NULL,
  Valor1  NUMERIC(18,4) NOT NULL,
  Valor2  NUMERIC(18,4) NOT NULL,
  Seguro  NUMERIC(18,4) NOT NULL,
  UDF1    NUMERIC(18,4) COMPUTED(TBTruncDec(Valor1 * Valor2, 4)),
  UDF2    COMPUTED(TBTruncDec(Valor1 * Valor2, 4)),
  Erro    SMALLINT NOT NULL,
  CONSTRAINT PK_Trunca PRIMARY KEY(Codigo));

CREATE INDEX IDX_Trunca_Erro ON Trunca(Erro);

Via programa feito em Delphi, inseri alguns milhões de registros nesta
tabela (6.198.200). Rodei o SELECT abaixo com vários filtros diferentes e
notei todas as vezes em que os operadores < e > foram usados com o campo
"Erro" o tempo de resposta foi demasiadamente longo, mesmo usando índice.

SELECT * FROM Trunca

---------- Filtrando pelo campo Erro, o qual tem índice
secundário -----------

Filtro: Erro > 0
Linhas retornadas: nenhuma
Tempo: mais de 2 minutos
PLAN (TRUNCA INDEX (IDX_TRUNCA_ERRO))

Filtro: Erro < 0
Linhas retornadas: nenhuma
Tempo: quase 2 minutos
PLAN (TRUNCA INDEX (IDX_TRUNCA_ERRO))

Filtro: Erro = 1
Linhas retornadas: nenhuma
Tempo: instantâneo
PLAN (TRUNCA INDEX (IDX_TRUNCA_ERRO))

---------- Filtrando pelo campo Codigo, que é chave-primária ----------

Filtro: Codigo > 7000000
Linhas retornadas: nenhuma
Tempo: instantâneo
PLAN (TRUNCA INDEX (PK_TRUNCA))

Filtro: Codigo < 0
Linhas retornadas: nenhuma
Tempo: instantâneo
PLAN (TRUNCA INDEX (PK_TRUNCA))

Filtro: Codigo = 100
Linhas retornadas: uma
Tempo: instantâneo
PLAN (TRUNCA INDEX (PK_TRUNCA))

Dúvida:

Porque os operadores relacionais < e > são tão lentos quando está sendo
usado um índice secundário? Seria um problema no otimizador do Firebird?
Alguém sabe alguma coisa sobre isto?

Atenciosamente.

Daniel P. Guimarães
Tecnobyte informática





Mais detalhes sobre a lista de discussão lista