Problema con Indice

13/07/2005 - 17:06 por Jorge Morales | Informe spam
Hola Grupo, ante todo gracias por su tiempo.

Tenemos un problema grave con un indice y un select, yo se que sin la base
de datos es dificil opinar algo, pero les comento por si a alguien le a
ocurrido algo parecido y me puede dar alguna luz:

El problema: Para un proceso se creo un indice (para otro proceso que no es
este), y el select que detallo mas abajo intenta usar ese indice y se
'muere', le borro el indice y dura como 13 segundos. Lo que quiero es
entender porque insiste en utilizar un indice que lo 'asesina'.



Base: Sqlserver 2000 con sp3

Tabla FA00: Encabezado de las facturas (como 300 mil lineas)
Tabla: FA01: Lineas que componen cada factura, con dos millones y medio de
registros

Indices de la FA01:

1: sPedido, sCodigo_Producto, sProductoCombo, bProductoCombo, cCantidad,
cPrecioNeto, sBodega

2: sCodigo_Producto, sPedido, cCantidad (** ESTE ES EL INDICE QUE CAUSA
EL PROBLEMA **)



Select que da el problema: Basicamente es un resumen por proveedor de las
ventas por mes y año

Select IN04.sProveedor,year(fa00.dFecha) as Anio,month(fa00.dFecha) as Mes,
sum ( Fa01.cCantidad * Fa01.cPrecioNeto * FA00.cDolar ) as VentaNeta
From FA00 ,FA01 ,IN04
Where ( (FA00.dFecha BETWEEN '02-01-2005'
AND '06-30-2005 11:59:29 pm'))
AND FA00.sFactura > ''
And FA00.sTipoFactura <> 'AN'
AND FA00.sPedido = FA01.sPedido
AND FA01.sCodigo_Producto = IN04.sCodigo_Producto
AND FA01.sProductoCombo = ''
Group by IN04.sProveedor,year(fa00.dFecha),Month(fa00.dFecha)


Si borro el segundo indice el select dura 13 segundos, y en el plan de
mantenimiento muestra que las filas estimadas son 2 millones y resto sobre
la FA01, Pero si existe el segundo indice, lo utiliza, le asigna un 0 % de
costo y dice que solo necesita barrer 38 filas y se muere.

Hemos probado lo siguiente:
1. Le actualizamos las estadisticas a la FA00 y FA01 y el problema siguio.
2. Pasamos la tabla a otro base de datos con una insercion masiva y el
problema siguio.
3. En una base de otro cliente, con los indices exactamente iguales
(logicamente con datos distintos) el problema NO ocurre.

Les agradecere mucho cualquier comentario

Saludos de Costa Rica

Jorge Morales

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
13/07/2005 - 19:33 | Informe spam
Jorge,

Interesante esto que te esta pasando. Tengo unas preguntas:

1 - Cual es el service pack que tienes instalado?
2 - Como ejecutas este query, directamente desde QA o lo tienes en un
procedimiento almacenado?

Pudieras postear el plan de ejecucion estimado de esta sentencia, con y sin
el indice (ve "set showplan_text" en los BOL para mas info)?


AMB

"Jorge Morales" wrote:

Hola Grupo, ante todo gracias por su tiempo.

Tenemos un problema grave con un indice y un select, yo se que sin la base
de datos es dificil opinar algo, pero les comento por si a alguien le a
ocurrido algo parecido y me puede dar alguna luz:

El problema: Para un proceso se creo un indice (para otro proceso que no es
este), y el select que detallo mas abajo intenta usar ese indice y se
'muere', le borro el indice y dura como 13 segundos. Lo que quiero es
entender porque insiste en utilizar un indice que lo 'asesina'.



Base: Sqlserver 2000 con sp3

Tabla FA00: Encabezado de las facturas (como 300 mil lineas)
Tabla: FA01: Lineas que componen cada factura, con dos millones y medio de
registros

Indices de la FA01:

1: sPedido, sCodigo_Producto, sProductoCombo, bProductoCombo, cCantidad,
cPrecioNeto, sBodega

2: sCodigo_Producto, sPedido, cCantidad (** ESTE ES EL INDICE QUE CAUSA
EL PROBLEMA **)



Select que da el problema: Basicamente es un resumen por proveedor de las
ventas por mes y año

Select IN04.sProveedor,year(fa00.dFecha) as Anio,month(fa00.dFecha) as Mes,
sum ( Fa01.cCantidad * Fa01.cPrecioNeto * FA00.cDolar ) as VentaNeta
From FA00 ,FA01 ,IN04
Where ( (FA00.dFecha BETWEEN '02-01-2005'
AND '06-30-2005 11:59:29 pm'))
AND FA00.sFactura > ''
And FA00.sTipoFactura <> 'AN'
AND FA00.sPedido = FA01.sPedido
AND FA01.sCodigo_Producto = IN04.sCodigo_Producto
AND FA01.sProductoCombo = ''
Group by IN04.sProveedor,year(fa00.dFecha),Month(fa00.dFecha)


Si borro el segundo indice el select dura 13 segundos, y en el plan de
mantenimiento muestra que las filas estimadas son 2 millones y resto sobre
la FA01, Pero si existe el segundo indice, lo utiliza, le asigna un 0 % de
costo y dice que solo necesita barrer 38 filas y se muere.

Hemos probado lo siguiente:
1. Le actualizamos las estadisticas a la FA00 y FA01 y el problema siguio.
2. Pasamos la tabla a otro base de datos con una insercion masiva y el
problema siguio.
3. En una base de otro cliente, con los indices exactamente iguales
(logicamente con datos distintos) el problema NO ocurre.

Les agradecere mucho cualquier comentario

Saludos de Costa Rica

Jorge Morales



Respuesta Responder a este mensaje
#2 Jorge Morales
14/07/2005 - 00:35 | Informe spam
Hola Alejandro

Muchas gracias por tu tiempo.

Tengo el SP3 instalado, y la consulta la pruebo con el query analizer.

La base es de uno de nuestros clientes y hasta mañana puedo volver a ir,
apenas tenga el plan de ejecucion te lo mando a ver si notas algo raro.

Saludos

Jorge Morales
Respuesta Responder a este mensaje
#3 Maxi
14/07/2005 - 01:07 | Informe spam
Hola, mmm que extraño!! que tipo de indice es ese? Cluster o noncluster? si
tuvieras el plan de ejecucion seria muy bueno :-)


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Jorge Morales" escribió en el mensaje
news:%
Hola Grupo, ante todo gracias por su tiempo.

Tenemos un problema grave con un indice y un select, yo se que sin la
base de datos es dificil opinar algo, pero les comento por si a alguien le
a ocurrido algo parecido y me puede dar alguna luz:

El problema: Para un proceso se creo un indice (para otro proceso que no
es este), y el select que detallo mas abajo intenta usar ese indice y se
'muere', le borro el indice y dura como 13 segundos. Lo que quiero es
entender porque insiste en utilizar un indice que lo 'asesina'.



Base: Sqlserver 2000 con sp3

Tabla FA00: Encabezado de las facturas (como 300 mil lineas)
Tabla: FA01: Lineas que componen cada factura, con dos millones y medio de
registros

Indices de la FA01:

1: sPedido, sCodigo_Producto, sProductoCombo, bProductoCombo, cCantidad,
cPrecioNeto, sBodega

2: sCodigo_Producto, sPedido, cCantidad (** ESTE ES EL INDICE QUE
CAUSA EL PROBLEMA **)



Select que da el problema: Basicamente es un resumen por proveedor de las
ventas por mes y año

Select IN04.sProveedor,year(fa00.dFecha) as Anio,month(fa00.dFecha) as
Mes,
sum ( Fa01.cCantidad * Fa01.cPrecioNeto * FA00.cDolar ) as VentaNeta
From FA00 ,FA01 ,IN04
Where ( (FA00.dFecha BETWEEN '02-01-2005'
AND '06-30-2005 11:59:29 pm'))
AND FA00.sFactura > ''
And FA00.sTipoFactura <> 'AN'
AND FA00.sPedido = FA01.sPedido
AND FA01.sCodigo_Producto = IN04.sCodigo_Producto
AND FA01.sProductoCombo = ''
Group by IN04.sProveedor,year(fa00.dFecha),Month(fa00.dFecha)


Si borro el segundo indice el select dura 13 segundos, y en el plan de
mantenimiento muestra que las filas estimadas son 2 millones y resto sobre
la FA01, Pero si existe el segundo indice, lo utiliza, le asigna un 0 % de
costo y dice que solo necesita barrer 38 filas y se muere.

Hemos probado lo siguiente:
1. Le actualizamos las estadisticas a la FA00 y FA01 y el problema siguio.
2. Pasamos la tabla a otro base de datos con una insercion masiva y el
problema siguio.
3. En una base de otro cliente, con los indices exactamente iguales
(logicamente con datos distintos) el problema NO ocurre.

Les agradecere mucho cualquier comentario

Saludos de Costa Rica

Jorge Morales

Respuesta Responder a este mensaje
#4 Jorge Morales
15/07/2005 - 02:33 | Informe spam
Ya encontramos el problema, de nuevo gracias a Alejandro y Maxi por su
interes ( y al grupo)

Resulta que dentro del select hay otra tabla mas que elimine del ejemplo que
postee pues la tabla de marcas (IN39) solo tiene 600 registros y pensamos
que no podia ser parte del problema (cada vez que intentamos pensar algo
sale mal !!)


El select sin cortes es ( se incorpora la tabla de 600 registros IN39)

Select IN04.sProveedor,year(fa00.dFecha) as Anio,month(fa00.dFecha) as Mes,
sum ( Fa01.cCantidad * Fa01.cPrecioNeto * FA00.cDolar ) as VentaNeta
From FA00 ,FA01 ,IN04, IN39
Where ( (FA00.dFecha BETWEEN '02-01-2005'
AND '06-30-2005 11:59:29 pm'))
AND FA00.sFactura > ''
And FA00.sTipoFactura <> 'AN'
AND FA00.sPedido = FA01.sPedido
AND FA01.sCodigo_Producto = IN04.sCodigo_Producto

AND IN04.sCodigo_Marca = IN39.sCodigo
AND IN39.bMarcaActiva = 1

AND FA01.sProductoCombo = ''
Group by IN04.sProveedor,year(fa00.dFecha),Month(fa00.dFecha)



Tenemos activadas la creacion automatica de estadisticas.

Como puedo prevenir que me pase esto con alguna otra tabla, metiendo dentro
del plan de mantenimiento que actualice las estadisticas ??

Una vez mas agradece cualquier comentario.


Saludos

Jorge Morales
Respuesta Responder a este mensaje
#5 Jorge Morales
15/07/2005 - 02:40 | Informe spam
Perdon, el problema se resolvio simplemente actualizandole las estadisticas
a la tabla IN39.

Jorge Morales
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida