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

#1 Sergio E.
05/06/2008 - 04:09 | Informe spam
no se mucho de esto pero, ¿no te valdria crearte un indice para cada
substring?
algo como un indice para substring(codnivel,5,2), otro apra
substring(codnivel 1,2) etc?

Saludos
Sergio E.


"Francisco" escribió en el mensaje
news:%
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.




Respuesta Responder a este mensaje
#2 Pablo Roca
05/06/2008 - 10:00 | Informe spam
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
#3 Pablo Roca
05/06/2008 - 10:03 | Informe spam
De entrada te recomiendo que te crees dos campos calculados (persistentes)
por cada uno de esos dos substrings.



Ah, de paso que los haces así .. pues es muy posible que te vayan mejor
pasandolos a int y realizando las consultas como int


Saludos,

Pablo Roca
La Coruna - Spain
http://www.portalfox.com
Respuesta Responder a este mensaje
#4 Gux (MVP)
05/06/2008 - 15:45 | Informe spam
No es posible crear indices para expresiones. Los indices se crean sobre
listas de columnas de las tablas.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Sergio E." wrote:

no se mucho de esto pero, ¿no te valdria crearte un indice para cada
substring?
algo como un indice para substring(codnivel,5,2), otro apra
substring(codnivel 1,2) etc?

Saludos
Sergio E.


"Francisco" escribió en el mensaje
news:%
> 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.
>
>
>
>



Respuesta Responder a este mensaje
#5 Gux (MVP)
05/06/2008 - 15:51 | Informe spam
En una columna de caracteres indizada, las búsquedas por fragmentos internos
o hacia la derecha de la columna no aprovecha la existencia de índices, por
lo que el rendimiento es malo. Las búsquedas por los primeros caracteres
desde la izquierda sí logran un rendimiento mejor.

Si usted está a tiempo puede hacer un mejor diseño: Si la columna es un
string cuyas subpartes tienen información propia, entonces deberían ser
columnas separadas.

Desde el punto de vista de la teoría, cada columna debe almacenar un valor
atómico cosa que usted no está haciendo.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Francisco" wrote:

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.





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