PDA

Ver la Versión Completa : Demora en consulta de tabla


GustavoCruz
24-10-2013, 19:48:13
Hola amigos del foro, tengo la siguiente tabla
SET SQL DIALECT 3;



/******************************************************************************/
/* Tables */
/******************************************************************************/


CREATE GENERATOR GEN_CUM_ID;

CREATE TABLE CUM (
IDE CODIGONUMERICO NOT NULL /* CODIGONUMERICO = INTEGER NOT NULL */,
PRODUCTO T240 /* T240 = VARCHAR(240) */,
TITULAR T240 /* T240 = VARCHAR(240) */,
REGISTROSANITARIO T240 /* T240 = VARCHAR(240) */,
FECHAEXPEDICION T240 /* T240 = VARCHAR(240) */,
FECHAVENCIMIENTO T240 /* T240 = VARCHAR(240) */,
ESTADOREGISTRO T240 /* T240 = VARCHAR(240) */,
EXPEDIENTECUM T240 /* T240 = VARCHAR(240) */,
CONSECUTIVOCUM NUMERO /* NUMERO = INTEGER */,
CANTIDADCUM NUMERO /* NUMERO = INTEGER */,
PRESENTACIONCOMERCIALCUM T240 /* T240 = VARCHAR(240) */,
ESTADOCUM T240 /* T240 = VARCHAR(240) */,
FECHAACTIVO T240 /* T240 = VARCHAR(240) */,
FECHAINACTIVO T240 /* T240 = VARCHAR(240) */,
UNIDAD T240 /* T240 = VARCHAR(240) */,
ATC T240 /* T240 = VARCHAR(240) */,
DESCRIPCIONATC T240 /* T240 = VARCHAR(240) */,
VIAADMINISTRACION T240 /* T240 = VARCHAR(240) */,
CONCENTRACION T240 /* T240 = VARCHAR(240) */,
PRINCIPIOACTIVO T240 /* T240 = VARCHAR(240) */,
UNIDADMEDIDA T240 /* T240 = VARCHAR(240) */,
CANTIDAD NUMERO /* NUMERO = INTEGER */,
UNIDADDEREFERENCIA T240 /* T240 = VARCHAR(240) */,
FORMAFARMACEUTICA T240 /* T240 = VARCHAR(240) */,
FABRICANTEIMPORTADOR T480 /* T480 = VARCHAR(480) */,
MODALIDAD T240 /* T240 = VARCHAR(240) */
);




/******************************************************************************/
/* Primary Keys */
/******************************************************************************/

ALTER TABLE CUM ADD PRIMARY KEY (IDE);


/******************************************************************************/
/* Triggers */
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/* Triggers for tables */
/******************************************************************************/



/* Trigger: CUM_BI */
CREATE OR ALTER TRIGGER CUM_BI FOR CUM
ACTIVE BEFORE INSERT POSITION 0
as
begin
if ((new.ide = 0)or(new.ide is null)) then
new.ide = gen_id(gen_cum_id, 1);
end
^


SET TERM ; ^
Dicha tabla almacena 181023 registros, necesito hacer una consulta por los siguientes campos: REGISTROSANITARIO, TITULAR, PRODUCTO, DESCRIPCIONATC
pero utilizando una sola caja de texto pensé en lo siguiente select * from CUM where upper(REGISTROSANITARIO||TITULAR||PRODUCTO||DESCRIPCIONATC) like '%textoabuscar%'
pero eso tarda demasiado, si alguien me puede ayudar con el asunto se lo agradecería muchísimo...

Gracias por vuestro tiempo

GustavoCruz

TiammatMX
24-10-2013, 20:40:29
...pero utilizando una sola caja de texto pensé en lo siguiente select * from CUM where upper(REGISTROSANITARIO||TITULAR||PRODUCTO||DESCRIPCIONATC) like '%textoabuscar%'
pero eso tarda demasiado, si alguien me puede ayudar con el asunto se lo agradecería muchísimo...

Por "una sola caja de texto" te refieres a que el usuario te proporcione un texto y buscarlo en la tabla, quiero suponer...

Por que mi sugerencia sería hacer una diferenciación entre los datos que contiene cada campo, es decir, pedir REGISTROSANITARIO, TITULAR, PRODUCTO, DESCRIPCIONATC en un TEdit (o lo que prefieras usar) y "armar" la cadena de búsqueda o usar un "WHERE" y "AND's" consecutivos en un SELECT hasta centrar la búsqueda en uno o varios registros resultado...

TOPX
24-10-2013, 20:41:29
Hola,

Por favor revise:

Consulta por Multiples campos - ClubDelphi (http://www.clubdelphi.com/foros/showthread.php?t=82340)
Buscar un registro por diferentes campos - ClubDelphi (http://www.clubdelphi.com/foros/showthread.php?t=83999)


Y ya luego de eso, vea:

Selectividad de los índices | Firebird SQL (http://firebird21.wordpress.com/2013/03/09/selectividad-de-los-indices/)
Firebird Surgeon: How to ruin Firebird performance with bad indices (http://firebirdsurgeon.blogspot.com/2011/07/how-to-ruin-firebird-performance-with.html)

-

jafera
25-10-2013, 18:56:08
Hola,

Por favor revise:

Buscar un registro por diferentes campos - ClubDelphi (http://www.clubdelphi.com/foros/showthread.php?t=83999)-

Este es de un hilo que abrí yo y me funciona de maravillas.

Saludos

Josep

GustavoCruz
27-10-2013, 18:04:05
Hola a todos amigos del foro, gracias por sus respuestas...

Mi idea es que funcione como lo hizo "algún tiempo", (no se si aún), Winamp, que en su base de datos; me refiero a la biblioteca, uno podía consultar una canción escribiendo el Título de la canción, el Interprete, Titulo del Album, etc... en una misma caja de texto.

Gracias por vuestro tiempo.


GustavoCruz

Casimiro Notevi
27-10-2013, 18:12:56
Pero eso no es así, sino una consulta por campos, algo similar a:

select * from tabla where titulo containing 'algo' and artista containing 'alguien' and album containing 'elquesea' ... ... ...

GustavoCruz
27-10-2013, 20:05:21
Hola Casimiro Notevi, lo que sucede con la solución que me indicas es que llegado el momento no me mostrará nada aunque realmente si hayan registros para mostrar y eso se debe porque se utiliza la palabra "AND" y si utilizo "OR" los resultados serán traumáticos en lo que a tiempo se refiere...

Gracias por vuestra ayuda

GustavoCruz

Casimiro Notevi
27-10-2013, 20:09:34
No te entiendo, pero debería especificar y aclarar correctamente exactamente la situación para que que te podamos ayudar.

GustavoCruz
27-10-2013, 20:18:44
Para una mayor claridad sobre lo que quiero hacer les dejo este link (http://www.invima.gov.co/images/pdf/tramites-y-servicios/consultas-registros-documentos-asociados/cums/cums_vigentes_15octubre2013a.xlsx) donde se encuentra un listado de Código Unicos de Medicamentos "CUM", esos datos en su totalidad voy a almacenar en una tabla en firebird v2.5.2 con la misma estructura. Y al momento de consultar (con una sola caja de texto, para no "marear" al usuario final) un registro, lo haga, por los campos: INVIMA, REGISTROSANITARIO, DESCRIPCIONATC, TITULAR, PRODUCTO; en ese caso el usuario puede consultar esa tabla de cerca unso 180000 registros por cualquiera de esos campos de forma simultánea;

Les ruego, si no es mucha molestia, que creen una base de datos y carguen en una tabla todos los registros del archivo y hagan la consulta que necesito, una sola caja de texto para realiza la búsqueda...

GustavoCruz

Casimiro Notevi
27-10-2013, 21:43:43
Entonces necesitas hacer la consulta como te he mostrado antes, aunque poniendo or y no and.
Y por supuesto, no olvides crear índices para esos campos.