[firebase-br] Problemas com desempenho em query na versão 2.1
Rodrigo Teodoro
teodoro_rodrigo em ig.com.br
Qui Abr 29 10:15:58 -03 2010
Opa! Elton,
Na verdade deu um trabalho do cão montar esta query. Ela foi feita a mão
partindo da regra comercial que seria aplicada. A regra comercial é um
pouco complexa mesmo, claro que sem o conhecimento do banco fica
complicado entender os relacionamentos.
Os campos desnecessários irei eliminar e melhorá-la agora que tenho
tempo. O meu banco de dados não é específico para uma regra de negócios.
Ele serve para vários sistemas semelhantes, logo, algumas coisas as
vezes não ficam tão bacanas quanto deveriam.
No caso, eu postei o meu problema no Firebird Tracker ontem e o Dmitry
apontou o erro e o motivo de ocorrer nas versões mais novas do Firebird.
Segue:
Your problem is that the following condition:
P.GRUPOSUBSORTIMENTO = DESCONTOS.CODGRUPOSUBSORTIMENTODESCONTO
cannot use an index in the modern Firebird versions, because values are
of different data types. P.GRUPOSUBSORTIMENTO is varchar(6) while
GD.CODGRUPOSUBSORTIMENTODESCONTO is integer.
This is an intended behavior, not a bug. So you may either change your
metadata or rewrite the problematic query using CAST:
P.GRUPOSUBSORTIMENTO = CAST(DESCONTOS.CODGRUPOSUBSORTIMENTODESCONTO
AS VARCHAR(6))
A condição correta seria: (P.GRUPOSUBSORTIMENTO =
DESCONTOS.GRUPOSUBSORTIMENTO AND DESCONTOS.DESCGRUPO > 0)
Como pude deixar passar isto! :( Quando eu refiz a query e ficou mais
rápida nem notei, já que os campos são bem parecidos.
O desempenho da query acertada foi a abaixo, ou seja, voltou ao normal
como na versão 2.0.
------ Info. Desempenho ------
Tempo de Preparação = 0ms
Tempo de Execução = 62ms
Tempo Médio Leitura = 1,77 ms
Memória Actual = 9.185.024
Memória Max = 10.488.444
Buffers de Memória = 2.048
Leituras do disco para a Memória Intermédia = 193
Escritas da Memória Intermédia para o disco = 0
Leituras da Memória Intermédia = 21.049
Com licença, vou pro canto chorar de raiva!
Mais detalhes sobre a lista de discussão lista