SQL Server - Optimización de Proceso SQL

 
Vista:

Optimización de Proceso SQL

Publicado por UTOPICOX (10 intervenciones) el 28/03/2007 16:00:49
Hola a todos en el foro
Estoy realizando una aplicación que trata de Objetivos de Venta para una serie de articulos, para esto debo calcular algunos indicadores aproximadamente unos 10 y debo hacerlo en kilos, plata y porcentaje de participación, primero probé hacerlos con tablas temporales, luego con tablas físicas y ahora estoy usando funciones, he logrado reducir los tiempos pero aún asi, hay actualizaciones que demoran casi 18 horas. A esto hay que agregarle que algunos indicadores necesitan información de al menos dos años hacia atras, actualmente mi tabla de indicadores para un solo mes tiene 52,000 registros y los cruzo con la historia que tiene 1.992.000 aprox.
Alguna idea de como optimizar este proceso...

Saludos,
UTOPICOX
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Optimización de Proceso SQL

Publicado por Isaías (3308 intervenciones) el 28/03/2007 19:32:21
Dependera de varios factores:

HARDWARE
MEMORIA
ESPACIO EN DISCO
VERSION DE SQL SERVER
INDICES
PLANES DE MANTENIMIENTO

Esos son algunos, claro, sin conocer como haces tu proceso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Optimización de Proceso SQL

Publicado por UTOPICOX (10 intervenciones) el 28/03/2007 19:55:04
Deja fuera el Hardware, la Memoria y el espacio en Disco que creo que estoy sobre el budget. Con respecto a la version de SQL es 2k, y si cada tabla tiene Indices, Clustered (para las llaves primarias) y non-Clustered(para las no primarias)....
Ahora en que puede influir los planes de mantenimiento a que mi proceso se realize de forma más óptima.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Optimización de Proceso SQL

Publicado por Isaías (3308 intervenciones) el 28/03/2007 21:50:19
Bueno, SQL SERVER 2000 (que no me dices que version, ENTERISE, MSDE, STANDAR, PERSONAL) es un motor TRANSACCIONAL, por tanto, hay que darle una "barridita a la casa" de vez en vez.

¿Para que me sirve mi PLAN DE MANTENIMIENTO?

Regenera INDICES
Limpia Logs
Recupera Espacios no ocupados
Valida la(s) base(s) de datos

Aunque dejame decirte que muchas veces las "Buenas Practicas de Desarrollo", influyen hasta en un 80% en el rendimiento del servidor

¿Utilizas Cursores?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Optimización de Proceso SQL

Publicado por UTOPICOX (10 intervenciones) el 28/03/2007 22:33:52
No, no utilizó cursores.

Imaginate esta tabla

CREATE TABLE Articulos
(
Indice int IDENTITY (1, 1)
IdArticulo varchar(18),
IdTerritorio int,
IdCategoria int,
Ano char(4),
Mes varchar(4)
Kilos float,
Pnv float,
Porc float
)

con 1.992.000 registros que corresponden a toda la historia

Bien, luego tengo otra tabla con las mismas caracteristicas de esta y ademas le incluyo estos campos:

CREATE TABLE Indicadores
(
Indice int IDENTITY(1,1),
TODOS LOS CAMPOS DE ARTICULOS
CrecimientoAcumulado float,
CrecimientoMesAnterior float,
CrecimientoAnoMovil float,
CrecimientoAnoCalendario float,
VentaEfectivaTresUltimosMeses float,
VentaEfectivaDosUltimosMeses float,
VentaEfectivaUltimosMes float,
PromedioDieciochoMesesMoviles float
)

Entonces, cada uno de estos campos se actualiza por un funcion contenida en un SP, como este:

CREATE PROCEDURE sp_OBJV_VentasMismoMesAnoAnterior
as
begin
Update B
Set VentasAMMKilos = A.VentasAMMKilos
from OBJV_Indicadores B inner join (Select dbo.func_OBJVVentasMismoMesAnoAnterior(Ano, Mes, IDArticulo, IDTerritorio, IDProdh) VentasAMMKilos, Indice, Ano, Mes, IDArticulo, IDTerritorio, IDProdh from OBJV_Indicadores) A
on A.Indice = B.Indice
where A.Indice = B.Indice
end

Bien, hay algunos de estas actualizaciones que demoran 5 horas, otras se realizan en 20 y hay algunas que aún no he podido determinar cuanto tiempo se demoran, Estas actualizaciones es lo que quiero optimizar.
No sé si con esto he ampliado tu panorama para poder darme alguna sugerencia.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Optimización de Proceso SQL

Publicado por Liliana (151 intervenciones) el 29/03/2007 15:56:11
Hola,
Con el permiso de Isaías...
Podrías copiar el código de tu función?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Optimización de Proceso SQL

Publicado por UTOPICOX (10 intervenciones) el 29/03/2007 16:21:47
******************************************************************************************
CREATE FUNCTION dbo.func_OBJVVentasMismoMesAnoAnterior(@Ano char(4), @Mes int, @IdArticulo varchar(18), @IDTerritorio int, @IDProdh int)
/*
Autor: José Lugo
Aplicación: Asignación y Respaldo de Objetivos de Venta
Objetivo: Calcula la venta efectiva de los tres últimos meses...
Fecha: 02/03/2007
*/
RETURNS float
AS
BEGIN
Declare @VentasAMMKilos float

Select @VentasAMMKilos = Isnull(Sum(Isnull(kilos,0)),0) from OBJV_Articulos
where Cast(Ano + Right('00' + rtrim(ltrim(Mes)),2) + '01' as datetime) = Dateadd(mm, -12, Cast(@Ano + Right('00' + rtrim(ltrim(@Mes)),2)+ '01' as datetime))
and IdArticulo = @IdArticulo and IDTerritorio = @IDTerritorio and IDProdh = @IDProdh

RETURN @VentasAMMKilos
END
*****************************************************************************************

Bien, aqui está el codigo de la función....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Optimización de Proceso SQL

Publicado por Liliana (151 intervenciones) el 29/03/2007 17:10:30
Bueno, si entiendo bien, podrías reemplazar el SP por un código similar al que pego abajo, eliminando el uso de funciones:

update B
Set VentasAMMKilos =
(select sum (kilos) from articulos a where A.idarticulo = B.idarticulo and ...)
from Indicadores B

Si no es esto exactamente lo que necesitas, por favor, pasanos algunas filas de datos y el resultado esperado, gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Optimización de Proceso SQL

Publicado por UTOPICOX (10 intervenciones) el 29/03/2007 17:54:52
Excelente sugerencia, quizás el uso de funciones era lo que hacia lento mi proceso, quite todas las funciones por Queries y he logrado reducir los tiempos hasta en incluso 37 segundos.

Saludos,
UTOPICOX
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Optimización de Proceso SQL

Publicado por Liliana (151 intervenciones) el 29/03/2007 18:14:21
Estamos hablando de 37 seg para todos los campos, o estás haciendo un UPDATE por cada columna?

Hay índice por año y mes?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Optimización de Proceso SQL

Publicado por UTOPICOX (10 intervenciones) el 29/03/2007 18:53:31
Estoy realizando un Update para cada columna, ya que cada uno de las Columnas tiene distintos criterios de agrupación, es por eso que no puedo hacerlo simultaneamente para todas.

Tengo Indices Articulo, Territorio, Categoria, Ano, Mes estos son Non-Clustered y el Indice de la tabla que es IDENTITY es Clustered.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Optimización de Proceso SQL

Publicado por Liliana (151 intervenciones) el 29/03/2007 19:48:13
Ya que hay índices que cubren las columnas de año y mes, se podría probar sin usar funciones con ellas para aprovecharlos, ya como último aporte.
Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar