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
 

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



Preguntas similares