Alternativas para agilizar consulta...

05/06/2008 - 03:13 por Francisco | Informe spam
Que tal Sres. tengo una tabla de aprox 5 millones de reg. y en dicha tabla
existe un campo 'codnivel' Char(20). Ejem: 020103050705.. Los 2
primeros(02), los 2 siguientes (01) y asi sucesivamente tienen un
significado. Ahora el campo tiene su indice y debo extraer informacion de
cualquier lugar de la cadena. Ejem:

Caso 1:
SELECT <campos>
FROM mytabla
WHERE LEFT(codnivel,2) IN ('01','02','03'..) --Esta consulta es lentisimo
<Ahora si lo cambio por (codnivel LIKE '01%' Or codnivel LIKE '02') y asi..>
se agilizar 3 veces puesto que si hace uso del indice. Pero aun asi siento
que es lento. He probado con los operadores y funciones conocidas pero no
logro agilizarlo masalguna sugerencia ???

Caso 2 (el mas usado)
SELECT <campos>
FROM mytabla
WHERE SUBSTRING(codnivel,5,2) IN ('03','04','07'...) --Esto es mas lento
todavia
<Aqui no tengo idea de como cambiarlo para que haga uso del indice>

Si hago uso del LEFT, SUBSTRING, IN ú otras funciones, la consulta es lenta
porque me parece que no hace uso del indice. Pero si utilizo el campo solo
sin nada que lo envuelva entonces es una bala la consulta. ¿Algunas
alternativas de como extraer la informacion de forma rapida ?..gracias.

Preguntas similare

Leer las respuestas

#6 Francisco
05/06/2008 - 17:24 | Informe spam
Gracias por sus sugerencias. No puedo agregar columnas a dicha tabla, pues
son de un proveedor externo y por contrato ninguna tabla debe ser alterada
en su integridad. Sigo haciendo pruebas y luego les comentare el resultado.
gracias a todos...


"Pablo Roca" escribió en el mensaje
news:
Hola Francisco,

De entrada te recomiendo que te crees dos campos calculados (persistentes)
por cada uno de esos dos substrings.

Crea un indice para cada uno de ellos y vuelve a probar las consultas. Ya
nos dirás.

No entiendo como haces un LIKE '01%' si lo que vas a mirar es a nivel de


dos
digitos, quitale ese %

Si lo haces (codnivel LIKE '01%' Or codnivel LIKE '02') . El LIKE es para
busquedas por contenido, cosa que no tiene sentido en el ejemñp que
planteas.

Yo prefiero hacerlo así:

(codnivel = '01' Or codnivel = '02' ...)


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com


Respuesta Responder a este mensaje
#7 Victor Koch
05/06/2008 - 17:32 | Informe spam
Hola,

Eso no quita que podes tener una tabla secundaria que se relacione con la
tabla principal y generar un trigger para que se actualice la tabla
secundaria.
Este cambio o agregado en el diseño no altera la integridad.

Un Saludo, Víctor Koch



"Francisco" escribió en el mensaje
news:%23Ovzz%
Gracias por sus sugerencias. No puedo agregar columnas a dicha tabla, pues
son de un proveedor externo y por contrato ninguna tabla debe ser alterada
en su integridad. Sigo haciendo pruebas y luego les comentare el
resultado.
gracias a todos...


"Pablo Roca" escribió en el mensaje
news:
Hola Francisco,

De entrada te recomiendo que te crees dos campos calculados
(persistentes)
por cada uno de esos dos substrings.

Crea un indice para cada uno de ellos y vuelve a probar las consultas. Ya
nos dirás.

No entiendo como haces un LIKE '01%' si lo que vas a mirar es a nivel de


dos
digitos, quitale ese %

Si lo haces (codnivel LIKE '01%' Or codnivel LIKE '02') . El LIKE es
para
busquedas por contenido, cosa que no tiene sentido en el ejemñp que
planteas.

Yo prefiero hacerlo así:

(codnivel = '01' Or codnivel = '02' ...)


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com






Respuesta Responder a este mensaje
#8 Penta
05/06/2008 - 18:36 | Informe spam
Siiii, me sumo a lo indicado por Victor.
Podrias tener un tabla que se actualice con Trigger en dicha tbala
podria tener:
codnivel Char(20).
Nivel1 varchar(xx)
Nivel2 varchar(xx)

Indices por Nivel1 y Nivel 2 y Join con tu tabla con codnivel

Atte.
Penta.
Respuesta Responder a este mensaje
#9 Francisco
05/06/2008 - 19:17 | Informe spam
En verdad les agradesco sus alternativas. Es una alternativa que lo consulte
antes de efectuarlo y que creenpues nada de nada, se oponen totalmente a
que haga algo en su base de datos. Mas tarde tendre reunion con gerencia
para analizar este tema...gracias por todo

"Penta" escribió en el mensaje
news:
Siiii, me sumo a lo indicado por Victor.
Podrias tener un tabla que se actualice con Trigger en dicha tbala
podria tener:
codnivel Char(20).
Nivel1 varchar(xx)
Nivel2 varchar(xx)

Indices por Nivel1 y Nivel 2 y Join con tu tabla con codnivel

Atte.
Penta.
Respuesta Responder a este mensaje
#10 Sergio E.
05/06/2008 - 20:51 | Informe spam
Si no puedes tocar SU base de datos, supongo que si puedes crearte una
propia, y en ella crear la tabla que necesitas y mediante un trigger
actualizarla desde la base de la compañia externa... estoy suponiendo que la
base de datos si esta en un servidor tuyo...

y por lo que tengo entendido puedes hacer select campos from
basededatos.esquema.tabla

Saludos
Sergio E.


"Francisco" escribió en el mensaje
news:ejA8Y%
En verdad les agradesco sus alternativas. Es una alternativa que lo
consulte
antes de efectuarlo y que creenpues nada de nada, se oponen totalmente
a
que haga algo en su base de datos. Mas tarde tendre reunion con gerencia
para analizar este tema...gracias por todo

"Penta" escribió en el mensaje
news:
Siiii, me sumo a lo indicado por Victor.
Podrias tener un tabla que se actualice con Trigger en dicha tbala
podria tener:
codnivel Char(20).
Nivel1 varchar(xx)
Nivel2 varchar(xx)

Indices por Nivel1 y Nivel 2 y Join con tu tabla con codnivel

Atte.
Penta.




Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida