Sql(Memoria) & Basic | SQL Server Performance Forums

SQL Server Performance Forum – Threads Archive

Sql(Memoria) & Basic

Buenas, agradeceria me pudieran ayudar, tengo una aplicacion en vb, tengo un promedio de 30 usuarios simultaneos, le aumente la memoria a mi servidor a 1 Giga pero se lo consume todo, limitarle la memoria es una alternativa pero no hay manera de indicarle al sql si hay un recurso que ya no se use, lo descarte?, y porque cada vez que ejecuto la aplicacion en codigo fuente, vb, aumenta el tamaño usado por vb hasta que se pone muy lento, tengo que cerrar y entrar nuevamente, sera porque hay objetos divorciados?, y si fuera asi, como deberia hacer mi consulta al sql, para borrar todo lo referente a la consulta realizada, y de vb porque cuando salgo del programa queda en memoria, como hago para salir adecuadamente.
Veamos por partes.
La memoria del servidor la administra SQL sin importar el código de la aplicación.
Seguramente que el Visual al ejecutar alguna consulta, exige al SQL mayor cantidad de memoria y por lo tanto la toma.
No importa si esa consulta se realiza en Visual o cualquier otro lenguaje.
El SQL administra la memoria dinámicamente (si es que está configurado así), y trata de mantener en memoria las páginas de datos que estan siendo usadas.
Si, en otro momento, la aplicación requiere otra página de datos que no está en memoria, SQL la aloca en memoria y así sucesivamente.
Cuando no tienen más memoria, comienza a pasar páginas de memoria a disco, con la consiguiente pérdida de performance. Para conocer si la memoria es suficiente, debería ejecutar el Monitor de Performance con el contador páginas/segundo.
Si este valor se mantiene durante períodos largos (15 minutos o más) muy por arriba del valor 20, entonces necesitas más memoria en el servidor. Además de 30 usuarios concurrentes:
1) Cuánto mide la base de datos?
2) Cómo es la configuración del servidor?
3) Qué versión de Sistema Operativo, SQL y services packs tienes? Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
Primero tengo 2 servidores con las mismas bases de datos, ya que estamos trabajando 2003 en uno
y 2004 en otro, las bases difieren de tamaño segun el uso, base de codificacion pesa 200 megas ,
el de transacciones administrativas va en 700 Megas en 2 años, y el de produccion que es de manejo
fuerte, es de 1.4 Gb, en solo 5 meses, el servidor principal es un Pentium IV de 2.8 con 1Gb de memoria,
windows Xp professional service pack 2, video 64 agp, el otro servidor es pentium III de 1.7 con
1Gb memoria y 64 video pci, en el primer servidor esta configurado como memoria dinamica y al otro
lo limito a 600Mg para sql ya que al ocupar mucha memoria el sql, me pone lenta la red y este a su vez es el servidor principal de red,
en el Nt no encuentro la opcion de contador de paginas, en el Xp si, pero en estos momentos estan usando
la pc, mas tarde lo vere, y las maquinas de desarrollo son pentium IV de 1.8 Gb y 256 memoria con 64 video AGP,
el problema es que cada vez que ingreso al sistema y salgo, sin necesidad de hacer nada mas que eso, vb aumenta
el uso de memoria lentamente hasta que me pone muy lenta la maquina, y en el caso de los usuarios, al salir del
sistema, este se queda en memoria y si no lo mato, empieza a usar el procesador al maximo poniendolo muy lento
bueno eso es en las maquinas terminales. Agradezco me puedas ayudar como lo haz hecho en lineas arriba. Muchas gracias
Hay algo que no entiendo.
Según tu comentario, el servidor principal tiene XP con sp2.
Si fuera así, el XP no tiene las funciones necesarias para administrar SQL 2000 server.
El XP solo soporta SQL 2000 Professional, que es una versión para probar pero de ninguna manera para producción. Para tener el panorama más claro te pido que detalles para cada equipo: 1) Configuración de Hardware ( incluyendo discos y RAID si la tuviera).
2) Sistema Operativo y Service Pack.
3) Tipo y Versión de SQL y services Packs. Con esos datos, podré entender mejor el problema. Saludos,
Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
Sql Server 2000 en la pantalla de instalación dice Sql Server 2000 Personal en ambos servidores. Servidor Principal, Pentium IV 2.8 Gb, 1Gb DDR, Mainboard 865 Intell, Video Ati Agp64, Disco duro de 40 Gb Seagate, no considero raid.
Windows Xp Profesional con Service Pack 2
Servidor Secundario, Pentium III 1.3 Gb, 1Gb DIM, Mainboard 845 Intell, Video 64 agp, no se de que marca, Disco duro de 40 Gb Seagate y un disco esclavo de 120G Seagate, donde se realizan los backups de los usuarios, no considero raid.
Windows NT 4 con Service Pack 6. Ambos son maquinas compatibles, no son de marca especifica y menos son servidores como los verdaderos servidores. Tengo tambien un cd de Sql 2000 Enterprise, sera este el sql que necesito, lo malo es que lo tengo en version pirata por lo que no puedo instalarlo en la empresa, del anterior sql si tengo la licencia, claro que no tengo para todas las conecciones, tenemos para 20 conecciones. Me gustaria me orientes como deberia tener todo, que tipo de servidor, de que capacidad y que versiones de sistema operativo y base de datos debo tener presente en un futuro (Teniendo en cuenta el volumen de base de datos de 1.4 Gb en solo 5 meses). Por ahora cuento con lo mencionado en anteriores lineas. Un comentario, que tal es el servicio de MySql de Linux? Lo haz visto, un amigo me aconseja migrar a MySql o a PostGress ya que cuentan ahora con similitudes al Sql de Microsoft y me evito la carga de licencias muy elevadas como las que ofrece Microsoft.

No puedo opinar sobre MySql o PostGress por que no los he usado. Con respecto al tema central, nunca tendrá performance adecuada con XP y SQL Personal.
No son para aplicaciones en producción, muchísimo menos con 30 usuarios. Lo ideal es tener Windows Server 2000/2003 con SQL Server Standard.
Con esto podrás administrar hasta 2Gb de memoria. Si piensas en mayor cantidad de memoria, entonces deberías usar SQL Enterprise. Con respecto al servidor: Sería deseable Pentium IV, 2Gb de RAM, con placa y discos SCSI. Podría comenzar con alguna placa que te permita soportar discos SCSI y generar RAID por Software ( lo hace el Windows), con lo cual tendrás mayor velocidad y seguridad. La base de datos no me parece demasiado grande como para pensar que sea necesario muchos discos. Con 2 de 36GB( para empezar) espejados (tendrás 36GB disponibles) lo cual te dará bastante tiempo antes de necesitar mayor capacidad de disco. Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
Hay alguna medida de emergencia que pueda hacer con la estructura que tengo, como podria mejorar el rendimiento del Sql o que debo hacer con el Xp, crees que mejor lo bajaria a Windows Nt4, y que obtendria si instalo el windows 2000 server o 2003 server version pirata y el sql enterprise tambien pirata, se que no deberia hacerlo pero estamos presentando la propuesta para el presupuesto 2005 y mientras nos aprueben pasara hasta marzo, y ya no puedo seguir asi, me olvide comentarte, hay situaciones en que parece que el servidor no da mas porque pone lentos a todos, y tengo que reiniciar el servidor para restablecer los servicios a su normalidad.
Tengo una consulta mas, que tan necesario es dejar crecer el archivo log, segun tengo entendido puedo restaurar datos perdidos en la base de datos desde el log, pero no se como y en fin cual es la meta de dejar crecer el log, un tiempo atras deje crecer el log y en dias llego a los 7 Gb, por lo que le puse reduccion automatica ahora se mantiene en 20 o 30 megas, que ventajas tengo de reducir automaticamente o dejarlo crecer, que tanto interfiere en el rendimiento del servidor. Muchas gracias
Con respecto al crecimiento del log, depende de que tipo de modelo de recuperación tienes en la base de datos.
Si es full, entonce el log crecerá. Este tipo de modelo de recuperación es útil cuando haces un backup del transaction log cada 2 horas, lo cual te permitiría recuperar ante una caida desde el último backup y el último transaction log.
Pero si tu realizas un backup completo en forma diaria, entonces debería cambiar el modelo de recuperación a simple, con esto evitarás el crecimiento del log. Con respecto al XP no hay nada que se pueda hacer ya que no está pensado para muchos usuarios, lo mismo con el SQL Personal. Por último, tengo la obligación de pedirte, como moderador de este Forum, que te abstengas de comentar sobre software no licenciado. Estas son la reglas de este Forum. Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
Ok, no se si creas en la palabra que te de, tampoco me gusta lo que es pirateria en una empresa pero para hacer pruebas muchas veces no podemos contar con el dinero suficiente para cubrir la compra de las licencias, yo uso una version del sql no registrada en mi computadora personal, es para desarrollo en casa y en las empresas donde implemento el sistema, si solicito adquirir las licencias para evitarme tambien problemas ya que hay un contrato con mi persona de por medio y me meteria en muchos problemas. Hace 1 año ya no desarrollo de forma independiente, trabajo estable en una empresa y mas bien si he molestado o molesto con tener una licencia no autorizada en mi casa, pido me disculpen y si creen conveniente que abandone el forum, lo comprendere, esa es mi palabra como profesional que me considero
mas bien te queria comentar, conversando con el administrador y con el gerente, les dije lo comentado por tu persona y me han solicitado que pida lista de precios de todo lo que se requiera pero aun no con una maquina servidor, solo para licencias de windows 2000 server, aunque prefiero sea el 2003, y sql standard, sera una pc de 3gb y dos discos de 80Gb, mas bien pido me orientes como realizar los raids pero eso sera cuando compren la maquina que supuestamente me dicen sera para la primera quincena de enero la evaluacion y para febrero estara toda la adquisicion en la empresa.
asi que tendre tiempo para seguir consultandote sobre los problemas que tengo en mi servidor actual y asi no tenerlos en el proximo servidor.
Como puedo acelerar un sp, es muy pesado, incluso mostrartelo te ha de marear, es uno que me ayuda a procesar los datos del almacen, stocks y calculos de precios promedios, un solo store que procesa mas de un almacen, a pesar que cada almacen tiene distinto comportamiento,
nos tomo mucho tiempo desarrollar pero ahora cuando hay tantos datos que manejar en un sistema dura 2 minutos, en otro mas fuerte dura 6 min y en el mas fuerte de todos los almacenes demora 6 a 9 minutos por mes, como ahora es fin de año, imaginate lo que me demoro. Uso en ese store
muchos cursores, pero si no quiero usarlos porque dicen eso pone lento el proceso, pero reviso mi store y nada, demora en los update a las tablas, ya que despues de calcular tengo que actualizar la tabla de movimientos.
Hice la prueba, quite los update y en el bucle o ciclo de calculo demora 6 segundos, pero como te digo los update son los demorones, como hago para agilizar un update?
No es necesario que abandones el Forum, solo es un comentario y te agradezco que lo hayas comprendido. Con respecto al tema del Servidor, con Windows 2000 y SQL Server Standard puedes direccionar hasta 2Gb.
Si piensas en 3GB, necesitarías Windows 2000 Advanced Server y SQL Server Entreprise.
Seguiremos con el tema cuando lo consideres oportuno. Con respecto a la sp que te sugiero lo siguiente: 1) Toma por partes la SP comenzando con los queries que tengan Select.
2) Copia esa parte del query al Analizador de Consultas.
3) Ejecuta en Index Tuning Wizard para ver si te sugiere índices que podrían acelerar ese query. (Antes verifica el query mirando el Plan de Ejecución).
4) Si te sugiere nuevos índices fíjate que la mejora sea por lo menos del 20%.
5) Lo ideal sería aplicar los índices nuevos en una base igual pero de prueba.
6) Repite los pasos anteriores para cada query de la SP, incluyendo los Update. Por cada query que encuentres dentro de la sp y encuentres índices para mejorar y los apliques, prueba la duración de la sp para compararla con la actual.
Estos son los pasos habituales para SQL Server, espero que te sirvan para XP y Personal.
Por otro lado: Tienes planes de mantenimiento que impliquen Reindexación de los indices actuales y Actualización de estadísticas? Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
La verdad no, por un detalle, he desarrollado sistemas o mejor dicho modulos pequeños que nunca he tenido necesidad de tener un plan de mantenimiento, estableciendo una tarea de mantenimiento, creo puedo reponer en algo, ya lo implemente 2 semanas atras pero no he visto mejora en el rendimiento del sistema, la reindexacion no la he podido llevar a cabo con normalidad ya que lo programo para que se ejecute en las noches y muchas veces el servidor es apagado porque toda la planta se queda sin energia, y no tengo una hora fija en que tenga energia, si lo hago durante el horario laboral supongo pondria lento a todos. La actualizacion de estadisticas si se realiza diariamente a la hora de refrigerio ya que un grupo sale a comer y el otro queda operativo esperando el retorno del otro grupo.
Bueno, entonces habrá que acomodarse a las circunstancias.
No obstante el problema sigue estando en el XP y el Personal.
El SQL Personal está pensado para que en la medida que tenga más usuarios, un algoritmo interno lo lentifica. De allí que con 30 usuarios, siempre tendrás problemas de performance.
Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
Abajo te muestro el store mas pesado que tengo, el modo de invocarlo es
SP_AlmacenReordenaKardex 8,2003,”,”,3,”,”,3,”,”,3,’AvioPartes’,’AvioPartesItems’,’AvioPartesCierre’, ‘AvioMesActivo’, ‘Avio_codi’, ‘Avio’, 2,1,3
para que tengas una idea, este proceso recupera todos los registros de un almacen ingresos y salidas y de acuerdo a si el motivo se costea o no, es muy amplio a pesar que es un sistema e almacen, pero hecho para textil, mis consultas o updates no son muy pesados, sino que
como veras hay un bucle de procesos, entonces lo que esta al medio del bucle se repite nada mas que 2136 veces, el total de articulos que manejo en el almacen, asi que acumulando un bucle atras de otro por 2136 da como resultado 9 minutos, si tienes alguna idea o mejora, gracias sino, de todas maneras gracias por tu apoyo.
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO Alter procedure Sp_AlmacenReordenaKardex
@Mes varchar(2),
@Anio varchar(4),
@Alm varchar(500),
@Alm1 varchar(500),
@TipoAlm int, –0=uno,1=en,2=entre,3=todos
@Hil varchar(5000),
@Hil1 varchar(5000),
@TipoHilo int ,
@Propie varchar(500),
@Propie1 varchar(500),
@TipoProp int,
@TablaHeadvarchar(200),
@TablaItemvarchar(200),
@TablaCierrevarchar(200),
@TablaMesvarchar(200),
@CampoCodigovarchar(50),
@CampoAbrevvarchar(50),
@TipoArticuloint,
@TipoActualizacion int, –0=ambos,1=precios
@Estado int output as
declare @Stock numeric(20,10),
@StockPP numeric(20,10),
@PreS numeric(20,10),
@PreD numeric(20,10),
@PrePS numeric(20,10),
@PrePD numeric(20,10),
@TotI numeric(20,10),
@TotS numeric(20,10),
@ValIS numeric(20,10),
@ValID numeric(20,10),
@ValSS numeric(20,10),
@ValSD numeric(20,10),
@TotIK numeric(20,10),
@TotSK numeric(20,10),
@ValISK numeric(20,10),
@ValIDK numeric(20,10),
@ValSSK numeric(20,10),
@ValSDK numeric(20,10),
@Prop int,@Hilo varchar(100),@Can numeric(20,10),@CanK numeric(20,10),
@TC numeric(20,10),@Cos Int,@Fecha datetime,@Tipo int,@Almacen int,@Mon int,@Orden int,@Vkar int,@Imp int DECLARE @NroCierre int, @Sql varchar(8000) if @TipoActualizacion=0
begin
EXEC(‘ DECLARE CURMES CURSOR FOR select Nrocierre from ‘ + @TablaMes + ‘ where mes=’ + @Mes + ‘ and año=’ + @Anio) OPEN CURMES
FETCH NEXT FROM CURMES INTO @NroCierre CLOSE CURMES
DEALLOCATE CURMES
end else
select @NroCierre=0 declare @Prop1 int,@Hilo1 varchar(100),
@Fecha1 datetime,@Almacen1 int declare @Consulta varchar(500)
select @consulta=’ ‘ select @CampoAbrev=ltrim(rtrim(@CampoAbrev)) if @TipoAlm=0 SELECT @Consulta=’ and h.Alma_Codi=’ + @Alm if @TipoAlm=1 sELECT @Consulta=’ and h.Alma_Codi in (‘ + @Alm + ‘)’ if @TipoAlm=2 SELECT @Consulta=’ and h.Alma_Codi between ‘ + @Alm + ‘ and ‘ + @Alm1
declare @Consulta1 varchar(5000)
select @consulta1=’ ‘ if @TipoHilo=0 SELECT @Consulta1=’ and ‘ + @CampoCodigo + ‘=’ + @Hil if @TipoHilo=1 sELECT @Consulta1=’ and ‘ + @CampoCodigo + ‘ in (‘ + @Hil + ‘)’ if @TipoHilo=2 SELECT @Consulta1=’ and ‘ + @CampoCodigo + ‘ between ‘ + @Hil + ‘ and ‘ + @Hil1 declare @Consulta2 varchar(5000)
select @consulta2=’ ‘ if @TipoProp=0 SELECT @Consulta2=’ and Prop_Codi=’ + @Propie if @TipoProp=1 sELECT @Consulta2=’ and Prop_Codi in (‘ + @Propie + ‘)’ if @TipoProp=2 SELECT @Consulta2=’ and Prop_Codi between ‘ + @Propie + ‘ and ‘ + @Propie1 –exec(‘SELECT Prop_Codi,’ + @CampoCodigo + ‘, Movi_Cant,
— Movi_PrecSole+Movi_Costo1S TotSol, Movi_PrecDola+Movi_Costo1D TotD, H.Movi_FechEmis,
— H.Oper_Tipo,Oper_COST as Costea,Oper_Orde as Orden,H.Alma_codi,dbo.f_CambioFecha(CASE WHEN H.Movi_Fechfact IS NULL THEN H.Movi_FechEmis ELSE H.Movi_FechFACT end) as TipoCambio,Mone_Codi,Oper_VisuKar,0 as stockinicialKar,isnull(CompTipo_Codi,0) as Imp
–into tmpKar
–fROM ‘ + @TablaItem + ‘ a INNER JOIN
— ‘ + @TablaHead + ‘ H ON a.Movi_Codi = H.Movi_Codi AND
— a.Alma_Codi = H.Alma_codi inner join bdcomun..Operacion Operacion on H.Oper_Codi=Operacion.Oper_Codi
–where (MONTH(H.Movi_FechEmis)=’ + @Mes + ‘) AND (YEAR(H.Movi_FechEmis) =’ + @Anio + ‘) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘ and (Oper_COST=1 or oper_visukar=0)
–UNION all
–SELECT Prop_Codi, ‘ + @CampoCodigo + ‘, SUM(Movi_Cant) ,
— 0, 0, H.Movi_FechEmis,
— H.Oper_Tipo,0 ,0,H.Alma_codi,0,-1,1,0,-1
–fROM ‘ + @TablaItem + ‘ a INNER JOIN ‘ + @TablaHead + ‘
— H ON a.Movi_Codi = H.Movi_Codi AND
— a.Alma_Codi = H.Alma_codi
— inner join bdcomun..Operacion Operacion on H.Oper_Codi=Operacion.Oper_Codi
–where oper_Cost=0 and oper_visukar=1
–GROUP BY H.Alma_codi,Prop_Codi, ‘ + @CampoCodigo + ‘,H.Movi_FechEmis,H.Oper_Tipo
–HAVING (MONTH(H.Movi_FechEmis) =’ + @Mes + ‘) AND (YEAR(H.Movi_FechEmis) =’ + @Anio + ‘) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘
–union all
–SELECT prop_codi,’ + @CampoCodigo + ‘,sum(stockinicial), max(precprominicsole), max(precprominicdola), fechainicial, – 1, 2,0,Alma_Codi,0,-1,-1,sum(stockinicialKar),-1
–FROM ‘ + @TablaCierre + ‘ h inner join ‘ + @Tablames + ‘ i on h.nrocierre=i.nrocierre
–WHERE i.mes=’ + @Mes + ‘ and I.Año=’ + @Anio + ‘ AND (stockinicial <> 0 or stockinicialKar<>0) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘
–group by h.alma_codi,prop_codi,’ + @CampoCodigo + ‘,fechainicial
–order by h.Alma_codi,prop_Codi,’ + @CampoCodigo + ‘,Movi_FechEmis,Costea desc,Orden,H.Oper_Tipo’
–) exec(‘declare cur cursor for SELECT Prop_Codi,’ + @CampoCodigo + ‘, Movi_Cant,
Movi_PrecSole+Movi_Costo1S+Movi_Costo2S+Movi_Costo3S+Movi_Costo4S, Movi_PrecDola+Movi_Costo1D+Movi_Costo2D+Movi_Costo3D+Movi_Costo4D, H.Movi_FechEmis,
H.Oper_Tipo,Oper_COST as Costea,Oper_Orde as Orden,H.Alma_codi,dbo.f_CambioFecha(CASE WHEN H.Movi_Fechfact IS NULL THEN H.Movi_FechEmis ELSE H.Movi_FechFACT end) as TipoCambio,Mone_Codi,Oper_VisuKar,0 as stockinicialKar,isnull(CompTipo_Codi,0) as Imp
fROM ‘ + @TablaItem + ‘ a INNER JOIN
‘ + @TablaHead + ‘ H ON a.Movi_Codi = H.Movi_Codi AND
a.Alma_Codi = H.Alma_codi inner join bdcomun..Operacion Operacion on H.Oper_Codi=Operacion.Oper_Codi
where (MONTH(H.Movi_FechEmis)=’ + @Mes + ‘) AND (YEAR(H.Movi_FechEmis) =’ + @Anio + ‘) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘ and (Oper_COST=1 or oper_visukar=0)
UNION all
SELECT Prop_Codi, ‘ + @CampoCodigo + ‘, SUM(Movi_Cant) ,
0, 0, H.Movi_FechEmis,
H.Oper_Tipo,0 ,0,H.Alma_codi,0,-1,1,0,-1
fROM ‘ + @TablaItem + ‘ a INNER JOIN ‘ + @TablaHead + ‘
H ON a.Movi_Codi = H.Movi_Codi AND
a.Alma_Codi = H.Alma_codi
inner join bdcomun..Operacion Operacion on H.Oper_Codi=Operacion.Oper_Codi
where oper_Cost=0 and oper_visukar=1
GROUP BY H.Alma_codi,Prop_Codi, ‘ + @CampoCodigo + ‘,H.Movi_FechEmis,H.Oper_Tipo
HAVING (MONTH(H.Movi_FechEmis) =’ + @Mes + ‘) AND (YEAR(H.Movi_FechEmis) =’ + @Anio + ‘) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘
union all
SELECT prop_codi,’ + @CampoCodigo + ‘,sum(stockinicial), max(precprominicsole), max(precprominicdola), fechainicial, – 1, 2,0,Alma_Codi,0,-1,-1,sum(stockinicialKar),-1
FROM ‘ + @TablaCierre + ‘ h inner join ‘ + @Tablames + ‘ i on h.nrocierre=i.nrocierre
WHERE i.mes=’ + @Mes + ‘ and I.Año=’ + @Anio + ‘ AND (stockinicial <> 0 or stockinicialKar<>0) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘
group by h.alma_codi,prop_codi,’ + @CampoCodigo + ‘,fechainicial
order by h.Alma_codi,prop_Codi,’ + @CampoCodigo + ‘,Movi_FechEmis,Costea desc,Orden,H.Oper_Tipo’
) if @@error<>0 goto err
open cur if @@cursor_rows=0 goto err
select @PreS=0
select @PreD=0
select @PrePS=0
select @PrePD=0
select @TotI=0
select @TotS=0
select @ValIS=0
select @ValID=0
select @ValSS=0
select @ValSD=0
select @TotIK=0
select @TotSK=0
select @ValISK=0
select @ValIDK=0
select @ValSSK=0
select @ValSDK=0 select @Stock=0
select @StockPP=0 fetch next from Cur Into @Prop,@Hilo,@Can,@PreS,@PreD,@Fecha,@Tipo,@CoS,@Orden,@Almacen,@TC,@Mon,@Vkar,@CanK,@Imp select @[email protected]
select @[email protected]
select @[email protected]
select @[email protected] –declare @incre numeric(20)
–select @incre = 1
WHILE @@FETCH_STATUS=0 BEGIN WHILE @[email protected] and @@FETCH_STATUS=0 begin
WHILE @[email protected] and @[email protected] and @@FETCH_STATUS=0
begin
–print @incre
–select @incre = @incre + 1
while @[email protected] and @[email protected] and @[email protected] and @@FETCH_STATUS=0
begin
while @[email protected] and @[email protected] and @[email protected] and @[email protected] and @@FETCH_STATUS=0
begin
–PRINT @Hilo
–IF @Hilo=’0301Z0001C5503′
–BEGIN
–PRINT ‘0301Z0001C5503’
–END
if @tipo=-1 — si es saldo inicial
begin
select @[email protected]
select @[email protected]
select @[email protected]
select @[email protected]
end
if @tipo=0 and @cos=1 — si es ingreso y se costea
begin
if @[email protected]>0
begin
select @preps=round(((round(@preps*@stockPP,3))+round(case when @Imp=2 or @mon=0 then @preS else case when @mon=1 then case when @Tc<=0 then @pred else round(@pred*@Tc,6) end end end* @Can,3))/(@[email protected]),6)
select @prepd=round(((round(@prepd*@stockPP,3))+round(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,6) end end end* @Can,3))/(@[email protected]),6)
end
else
begin
select @preps=0
select @prepd=0
end select @[email protected]+ROUND(case when @Imp=2 or @mon=0 then @preS else case when @mon=1 then case when @Tc<=0 then @Pred else round(@preD*@Tc,6) end end end*@can,3)
select @[email protected]+ROUND(case when @Imp=2 or @mon=0 then @preS else case when @mon=1 then case when @Tc<=0 then @Pred else round(@preD*@Tc,6) end end end*@can,3)
–if @Tc>0
–begin
select @[email protected]+ROUND(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,6) end end end*@can,3)
select @[email protected]+ROUND(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,6) end end end*@can,3)
–end
select @[email protected][email protected]
select @[email protected][email protected]
select @[email protected][email protected] select @[email protected][email protected]
end
if @tipo=0 and @cos=0 —- si es ingreso y no se costea, se actualiza la tabla de movimientos
begin
–IF @Hilo=’0301Z0001C5503′
–BEGIN
–PRINT @prepS
–PRINT @stock
—-PRINT ‘0301Z0001C5503’
–END
if @prepS = 0 and @stock = 0
BEGIN
–ir 0301Z0001C5503
select @Sql = ‘Declare CurPPAnt cursor for Select top 1 PrecPromFinaSole, PrecPromFinaDola from ‘
+ @TablaCierre + ‘ Deta
inner join ‘ + @TablaMes + ‘ Cabe on Deta.NroCierre = Cabe.NroCierre
where ‘ + @CampoCodigo + ‘= ”’ + ltrim(rtrim(@Hilo)) + ”’
and Mes < ‘ + cast(@Mes as varchar(20)) + ‘ and
Año <= ‘ + cast(@Anio as varchar(20)) + ‘ and
PrecPromFinaSole > 0
order by Cabe.NroCierre desc ‘
–print @SQl
exec(@Sql)
–print @Hilo open CurPPAnt
if @@cursor_rows > 0
begin
fetch next from CurPPAnt into @prepS, @prepd
end
else
begin
select @prepS = 0
select @prepD = 0
end
close CurPPAnt
deallocate CurPPAnt
–IF @Hilo=’0301Z0001C5503′
–BEGIN
–PRINT ‘d’ + cast(@prepS as varchar(20))
–PRINT @stock
—-PRINT ‘0301Z0001C5503’
–END
— print @prepS
— print @prepd
end
–ELSE
–BEGIN
–PRINT @prepS
–PRINT @stock
–END
select @[email protected]+ROUND(@prepS*@can,3)
select @[email protected]+ROUND(@prepd*@can,3)
select @[email protected][email protected]
select @[email protected][email protected]
IF @Vkar=1
BEGIN
select @[email protected][email protected]
select @[email protected]+ROUND(@prepS*@can,3)
select @[email protected]+ROUND(@prepd*@can,3)
select @[email protected][email protected]
END
end
if @tipo=1 and @cos=1– si es salida y se costea
begin
if @[email protected]>0
begin
select @preps=round(((round(@preps*@stockPP,3))-round(case when @Imp=2 or @mon=0 then @pres else case when @mon=1 then case when @Tc<=0 then @Pred else round(@pred*@Tc,6) end end end * @Can,3))/(@[email protected]),6)
select @prepd=round(((round(@prepd*@stockPP,3))-round(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,6) end end end * @Can,3))/(@[email protected]),6)
end
else
begin
select @preps=0
select @prepd=0
end
select @[email protected]+ROUND(case when @Imp=2 or @mon=0 then @pres else case when @mon=1 then case when @Tc<=0 then @Pred else round(@preD*@Tc,6) end end end*@can,3)
select @[email protected]+ROUND(case when @Imp=2 or @mon=0 then @pres else case when @mon=1 then case when @Tc<=0 then @Pred else round(@preD*@Tc,6) end end end*@can,3) –if @Tc>0
–begin
select @[email protected]+ROUND(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,6) end end end*@can,3)
select @[email protected]+ROUND(case when @Imp=2 or @mon=1 then @pred else case when @mon=0 then case when @Tc<=0 then @pres else round(@pres/@Tc,6) end end end*@can,3)
–end
select @[email protected][email protected]
select @[email protected]@can
select @[email protected]@can
select @[email protected][email protected]
end
if @tipo=1 and @cos=0– si es salida y no se costea, se actualiza la tabla de movimientos
begin
select @[email protected]+ROUND(@prepS*@can,3)
select @[email protected]+ROUND(@prepd*@can,3)
select @[email protected][email protected]
select @[email protected]@can
IF @Vkar=1
BEGIN
select @[email protected]@can
select @[email protected]+ROUND(@prepS*@can,3)
select @[email protected]+ROUND(@prepd*@can,3)
select @[email protected][email protected]
END
end fetch next from Cur Into @Prop,@Hilo,@Can,@PreS,@PreD,@Fecha,@Tipo,@CoS,@Orden,@Almacen,@TC,@Mon,@Vkar,@CanK,@Imp
end print (‘update a set movi_precsole=’ + cast(@preps as varchar(20)) + ‘,movi_precdola=’ + cast(@prepd as varchar(20)) + ‘,
Movi_ImpoSole=round(Movi_Cant*’ + cast(@preps as varchar(20)) + ‘,3),Movi_ImpoDola=round(Movi_Cant*’ + cast(@prepd as varchar(20)) + ‘,3)
from ‘ + @TablaItem + ‘ a inner join ‘ + @TablaHead + ‘ b on a.Alma_Codi=b.Alma_Codi and a.Movi_Codi=b.Movi_Codi
where b.Alma_Codi=’ + cast(@Almacen1 as varchar(20)) + ‘ And Movi_FechEmis=”’ + convert(varchar(20), @Fecha1,103) + ”’ and dbo.F_Oper_Costea(Oper_Codi)=0 and ‘ + @CampoCodigo + ‘=”’ + @Hilo1 + ”’ and Prop_Codi=’ + cast(@Prop1 as varchar(20)))
exec(‘update a set movi_precsole=’ + @preps + ‘,movi_precdola=’ + @prepd + ‘,
Movi_ImpoSole=round(Movi_Cant*’ + @preps + ‘,3),Movi_ImpoDola=round(Movi_Cant*’ + @prepd + ‘,3)
from ‘ + @TablaItem + ‘ a inner join ‘ + @TablaHead + ‘ b on a.Alma_Codi=b.Alma_Codi and a.Movi_Codi=b.Movi_Codi
where b.Alma_Codi=’ + @Almacen1 + ‘ And Movi_FechEmis=”’ + @Fecha1 + ”’ and dbo.F_Oper_Costea(Oper_Codi)=0 and ‘ + @CampoCodigo + ‘=”’ + @Hilo1 + ”’ and Prop_Codi=’ + @Prop1) if @@error<>0 goto err select @[email protected]
end
if @TipoActualizacion=0
begin
exec(‘update ‘ + @TablaCierre + ‘ set StockMes=case when ‘ + @TotI + ‘=0 and ‘ + @TotS + ‘=0 then 0 else ‘ + @TotI + ‘-‘ + @Tots + ‘ end ,StockMesKar=case when ‘ + @TotIk + ‘=0 and ‘ + @TotSk + ‘=0 then 0 else ‘ + @TotIk + ‘-‘ + @Totsk + ‘ end ,PrecPromFinaSole=’ + @PrepS +
‘,PrecPromFinaDola=’ + @PrepD + ‘,TotaIngr=’ + @TotI + ‘,TotaIngrKar=’ + @TotIK +
‘,TotaSali=’ + @TotS + ‘,TotaSaliKar=’ + @TotSK + ‘,ValIngS=’ + @ValIS + ‘,ValIngKarS=’ + @ValISK +
‘,ValIngD=’ + @ValID + ‘,ValIngKarD=’ + @ValIDK + ‘,ValSalS=’ + @ValSS + ‘,ValSalKarS=’ + @ValSSK +
‘,ValSalD=’ + @ValSD + ‘,ValSalKarD=’ + @ValSDK + ‘
from ‘ + @TablaCierre + ‘ Cierre inner join ‘ + @TablaMes + ‘ MesActivo
ON cIERRE.NroCierre=MesActivo.NroCierre
where Alma_Codi=’ + @Almacen1 + ‘
and Prop_Codi=’ + @Prop1 + ‘ and ‘ + @CampoCodigo + ‘=”’ + @Hilo1 + ”’ and mes=’ + @mES + ‘ AND aÑO=’ + @aNIO )
IF @@rOWcOUNT=0
exec(‘ INSERT INTO ‘ + @TablaCierre + ‘ VALUES(‘ + @NroCierre + ‘,’ + @Almacen1 + ‘,’ + @Prop1 + ‘,”’ + @Hilo1 + ””
+ ‘,0,0,0,0,’ + @TotI + ‘-‘ + @Tots + ‘,’ + @TotIk + ‘-‘ + @Totsk + ‘,0,0,’ +
@TotI + ‘,’ + @TotIk + ‘,’ + @TotS + ‘,’ + @TotSk + ‘,’ + @ValIS + ‘,’ +
@ValISk + ‘,’ + @ValId + ‘,’ + @ValIdk + ‘,’ + @ValSS + ‘,’ + @ValSSK + ‘,’ + @ValSd + ‘,’ + @ValSdK + ‘)’)
if @@error<>0 goto err
end
else
begin
exec(‘update ‘ + @TablaCierre + ‘ set PrecPromFinaSole=’ + @PrepS +
‘,PrecPromFinaDola=’ + @PrepD + ‘
from ‘ + @TablaCierre + ‘ Cierre inner join ‘ + @TablaMes + ‘ MesActivo
ON cIERRE.NroCierre=MesActivo.NroCierre
where Alma_Codi=’ + @Almacen1 + ‘
and Prop_Codi=’ + @Prop1 + ‘ and ‘ + @CampoCodigo + ‘=”’ + @Hilo1 + ”’
and mes=’ + @mES + ‘ AND aÑO=’ + @aNIO ) if @@error<>0 goto err
end –select @PreS=0
–select @PreD=0
select @PrePS=0
select @PrePD=0
select @TotI=0
select @TotS=0
select @ValIS=0
select @ValID=0
select @ValSS=0
select @ValSD=0
select @stock=0 select @TotIK=0
select @TotSK=0
select @ValISK=0
select @ValIDK=0
select @ValSSK=0
select @ValSDK=0
select @stockPP=0
select @[email protected]
end
select @[email protected]
end
select @[email protected]
end
err: if @@error=0
select estado=0
else
select estado=1
close cur
deallocate cur
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Como veras, uso mucho el exec(), ya que si cambio de almacen, solo mando las tablas que pertenecen al almacen y funciona sin problema alguno, y tambien porque de acuerdo al comportamiento que tenga cada almacen se parametriza como puedes observar al inicio, si tiene lote o calidad u otro factor que diferencie un almacen de otro.
Mi sugerencia antes de cambiar algo del código es realizar los pasos que te recomedé en el último post. Por ejemplo, copia el siguiente query al Analizador de consultas: ‘SELECT Prop_Codi,’ + @CampoCodigo + ‘, Movi_Cant,
— Movi_PrecSole+Movi_Costo1S TotSol, Movi_PrecDola+Movi_Costo1D TotD, H.Movi_FechEmis,
— H.Oper_Tipo,Oper_COST as Costea,Oper_Orde as Orden,H.Alma_codi,dbo.f_CambioFecha(CASE WHEN H.Movi_Fechfact IS NULL THEN H.Movi_FechEmis ELSE H.Movi_FechFACT end) as TipoCambio,Mone_Codi,Oper_VisuKar,0 as stockinicialKar,isnull(CompTipo_Codi,0) as Imp
–into tmpKar
–fROM ‘ + @TablaItem + ‘ a INNER JOIN
— ‘ + @TablaHead + ‘ H ON a.Movi_Codi = H.Movi_Codi AND
— a.Alma_Codi = H.Alma_codi inner join bdcomun..Operacion Operacion on H.Oper_Codi=Operacion.Oper_Codi
–where (MONTH(H.Movi_FechEmis)=’ + @Mes + ‘) AND (YEAR(H.Movi_FechEmis) =’ + @Anio + ‘) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘ and (Oper_COST=1 or oper_visukar=0)
–UNION all
–SELECT Prop_Codi, ‘ + @CampoCodigo + ‘, SUM(Movi_Cant) ,
— 0, 0, H.Movi_FechEmis,
— H.Oper_Tipo,0 ,0,H.Alma_codi,0,-1,1,0,-1
–fROM ‘ + @TablaItem + ‘ a INNER JOIN ‘ + @TablaHead + ‘
— H ON a.Movi_Codi = H.Movi_Codi AND
— a.Alma_Codi = H.Alma_codi
— inner join bdcomun..Operacion Operacion on H.Oper_Codi=Operacion.Oper_Codi
–where oper_Cost=0 and oper_visukar=1
–GROUP BY H.Alma_codi,Prop_Codi, ‘ + @CampoCodigo + ‘,H.Movi_FechEmis,H.Oper_Tipo
–HAVING (MONTH(H.Movi_FechEmis) =’ + @Mes + ‘) AND (YEAR(H.Movi_FechEmis) =’ + @Anio + ‘) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘
–union all
–SELECT prop_codi,’ + @CampoCodigo + ‘,sum(stockinicial), max(precprominicsole), max(precprominicdola), fechainicial, – 1, 2,0,Alma_Codi,0,-1,-1,sum(stockinicialKar),-1
–FROM ‘ + @TablaCierre + ‘ h inner join ‘ + @Tablames + ‘ i on h.nrocierre=i.nrocierre
–WHERE i.mes=’ + @Mes + ‘ and I.Año=’ + @Anio + ‘ AND (stockinicial <> 0 or stockinicialKar<>0) ‘ + @Consulta + ‘ ‘ + @Consulta1 + ‘ ‘ + @Consulta2 + ‘
–group by h.alma_codi,prop_codi,’ + @CampoCodigo + ‘,fechainicial
–order by h.Alma_codi,prop_Codi,’ + @CampoCodigo + ‘,Movi_FechEmis,Costea desc,Orden,H.Oper_Tipo
Reemplaza las variables por valores y fíjate si el Index Tuning Wizard te recomienda algún índice para mejorar la performance.
Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
Estuve revisando lo que me dijste pero no me aconseja la generacion de mas indices que los que ya tengo generado, una consulta, tengo una tabla llamada tickets, que tiene mas de 1 millon de registros, pero porque su indice principal que es de tipo char(15) pesa 655472 kb, segun me indica el optimizador de indices, y la base de datos es de 1.4 Gb, casi el 50% de la base de datos es ese indice, es optimo eso o a que creas que se deba, o como puedo solucionarlo, y porque mi carpeta presenta fuego?
Para que ese índice tenga ese peso debe ser porque es un Cluster Index, toda tabla debería tener un cluster index.
Ahora, quizás puedas tener un cluster sobre esa tabla con un campo más chico, tipo int. En ese caso podrías probar eliminando el índice actual (si es como sospecho cluster) y crear un no cluster con el mismo campo.
En ese caso podrís ahorra espacio, pero debes verificar que no pierdas performance. Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
Ok revisare, si es un campo cluster, ya que es mi llave principal, es el identificador de cada codigo de barra que se genera en el sistema, pero que pasaria si lo establezco sin cluster, que tan rapida serian las consultas, o me pondria lento, eso creo yo me lo respondere cuando lo pruebe, gracias por el consejo. Una consulta, estoy probando limitar la memoria del sql a 800 Megas, ya que observo que cuando supera el giga de memoria en el xp, es donde el servicio se pone muy lento, tanto que una simple consulta demora varios segundos, y el espacio de memoria en disco en cuanto deberia dejarlo, por ahora no tiene memoria de disco asignada.
Es una buena prueba lo de la memoria.
Con respecto al cluster seguramente las consultas serán más lentas, pero podrías probar que no sea cluster a ver que pasa.
Luis Martin
Moderator
SQL-Server-Performance.com All postings are provided “AS IS” with no warranties for accuracy.
Tengo una duda o curiosidad, que hace el actualizar estadisticas y que tan importante es tener desactivada esa opcion, otra es el reducir la base de datos automaticamente lo tengo activo, debo desactivarlo?, y como haria mi mantenimiento para reducir la base de datos, ya probe la reindexacion de base de datos diariamente y mi base de datos bajo casi 600 Megas, he puesto el proceso de reindexacion y estadisticas diariamente a la 8 en cada base de datos con un intervalo de 30 minutos una de otra.
Gracias Jesus Aguilar
Normalmente es conveniente no tener activados ni el autoupdate statistic ni auto shrink en producción y que cada tanto se levantan procesos en background que realizan esas tareas,
por lo tanto conviente hacer un plan de mantenimiento general, semanal por ejemplo, que realice las dos tareas junto con reindexacion y chequeos de consistencia.
Ok, revisare la ayuda de Sql, y como realizo el chequeo de consistenacia en comando porque lo vi pero como asistente de mantenimiento, me gustaria ver todo el mantenimiento de una base de datos en codigo. Ah, y gracias por tu ayuda c maldon, si alguien puede ver a LuisMartin le dicen que gracias y que tenga un feliz año nuevo 2005, tanto para el como para todos los participantes de este foro que ha sido, es y seguira siendo de gran ayuda para mucha gente que tiene mucho interes en conocer y enseñar, a todos gracias.
Jesus Aguilar

]]>