PDA

Ver la Versión Completa : Consulta sql lenta en Firebird


DamianG
03-05-2012, 20:02:27
Hola, tengo la siguiente consulta que ejecuto en un form donde tengo un campo edit, alli se ingresa la descripcion de un articulo y se va ejecutando al pulsar Enter, o segun yo lo defina al pulsar cada tecla, el tema es que monitoreando la base me dice que el comando es muy lento:

comando := 'select a.CODART,' +
'a.CODRUB,'+
'a.DESCRI,'+
'a.UNIDAD,'+
'a.PUNPED,'+
'a.TASA1, '+
'a.TASA2, '+
'a.HABILI,'+
'a.TOTRUB,'+
'a.TOTDIV,'+
'a.CODFAB,'+
'a.AVIPUN,'+
'a.CANTID,'+
'a.CANCOM,'+
'a.CANDIS,'+
'a.CANPED,'+
'a.CANTI2,'+
'a.CANTI3,'+
'a.CANTI4,'+
'a.CANTI5,'+
'a.IMAGEN,'+
'a.FPREC1,'+
'a.FPREC2,'+
'a.FPREC3,'+
'a.FPREC4,'+
'a.FPREC5,'+
'a.FPREC6,'+
'a.CUSER1,'+
'a.CUSER2,'+
'a.CUSER3,'+
'a.CUSER4,'+
'a.CUSER5,'+
'a.CUSER6,'+
'a.UTILID,'+
'a.UTILI2,'+
'a.UTILI3,'+
'a.UTILI4,'+
'a.UTILI5,'+
'a.CODART2,'+
'a.CODOTR,'+
'a.COSTOCD,'+
'a.COSTOVV,'+
'a.COSTOBE,'+
'a.COSTOBG,'+
'a.COSTOBK,'+
'a.COSTO, '+
'a.TASAIB, '+
'a.PREC1, '+
'a.PREC2, '+
'a.PREC3, '+
'a.PREC4, '+
'a.PREC5, '+
'a.CANTI6, '+
'a.CANTI7, '+
'a.CANTI8, '+
'a.INFUTI, '+
'a.TALLE, '+
'a.COLOR, '+
'a.CODBAR, '+
'a.NROIMP, '+
'a.PRESU20,'+
'a.PRESU25,'+
'a.PRESU28,'+
'a.PRESU30,'+
'a.PRESU40,'+
'a.COSSINIVA,'+
'a.D1, '+
'a.D2, '+
'a.D3, '+
'a.D4, '+
'a.D5, '+
'a.IMPINT,'+
'a.FLETE,'+
'a.PRESULU,'+
'a.COSSIN,'+
'a.PRECOM,'+
'a.P1M,'+
'a.P2M,'+
'a.P3M,'+
'a.P4M,'+
'a.P5M,'+
'a.PFINAL,'+
'rubros.descri as desrub, fabrica.descri as desfab, otrcla.descri as desotr FROM articulo a '+

'left join rubros on a.codrub = rubros.codrub ' + //puede ser el LEFT JOIN el problema?
'left join fabrica on a.codfab = fabrica.codfab ' +
'left join otrcla on a.codotr = otrcla.codotr ' ;

comando := comando + 'where a.habili = ''S'' ';

comando := comando + 'and a.' + xcampo + ' starting with ''' + xfildes + ''' '

if xfilrub <> '' then //FILTRO POR RUBRO
comando := comando + 'and a.codrub = ''' + xfilrub + ''' ';

comando := comando +'order by a.descri';

datafb.query_articulo.SQL.TEXT := comando;
datafb.query_articulo.open;

Tengo creados indices por los campos, codart, codrub, codfab, codotr, habili y descri que son los campos necesarios indexar.

Alguien puede orientarme en si algo esta mal?

Gracias!!

ecfisa
03-05-2012, 20:05:45
Hola DamianG.

Por favor cuando incluyas código en tus mensajes utiliza TAG's para darle mayor legibilidad. Te pongo una imágen que explica su uso:

http://img403.imageshack.us/img403/3461/75416396.jpg

Saludos y gracias por tu colaboración. :)

DamianG
03-05-2012, 20:10:39
ok ahi lo acomode parece, muchas gracias

roman
03-05-2012, 20:18:08
Tengo creados indices por los campos, codart, codrub, codfab, codotr, habili y descri que son los campos necesarios indexar.


Pero tu consulta tiene un xcampo + ' starting with ' y supongo que debes tener también un índice sobre ese campo.

// Saludos

DamianG
03-05-2012, 20:56:54
Si, es el campo DESCRI (xcampo es el nombre en el procedimiento que ejecuta la consulta) y tiene indice, tambien agregue un indice al campo HABILI que es para veri si esta habilitado o no el articulo, el valor es S o N...

Los LEFT JOIN seran el problema?

mightydragonlor
03-05-2012, 21:32:11
Los LEFT JOIN seran el problema?
No Realmente, puede que si, puede que no, no poseemos información suficiente, cantidad de registros, comparativo desde aplicación y administrador de base de datos en cuanto a la ejecución de la consulta, plan de ejecución, servidor, ancho de banda, son muchas las variables, lo que yo suelo hacer en primer lugar, es hacer la consulta en un administrador visual, si es lenta, revisar si es problema de la consulta en si, comentar Joins, funciones, ampliar condiciones y revisar registros retornados, creo que deberías empezar por ahí.

Saludos.