Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   SQL Server lento. (https://www.clubdelphi.com/foros/showthread.php?t=61873)

look 25-11-2008 17:05:18

SQL Server lento.
 
Hola Compañeros del foro , Tengo la siguiente inquietud;
Veran Tengo un Servidor con las Siguientes Caracteristicas:
*Hewlett Packard ML 150 G2
*Procesador Dual Core Xeon 3.2 Ghz
*Memoria Ram 2 GB
*Dos HDD de 36.4 GB SCSI

SO Windos Server 2003, SQL server 2000 Service Pack 4,tengo 5 Maquinas
de Facturacion , de las cuales solo 3 trabajan arduamente porque en los otros
departamentos no hay mucho movimiento, y tambien tengo otras 3 pcs que solo las utilizan para hacer, movimientos al inventario , consultas y demas.
ya ha pasado hace un mes aproximadamente desde la implemetacion del
sistema y se me an presentado varios problemas de lentitud , es decir , ultimamete se el proceso se ha vuelto lento, pareciera que el servidor se
quedara sin memoria ya que cuando reinicio el servidor todo vuelve a la normalidad, lo extraño tambien es que no todos los dia pasa,pero ya me empiezo a preocupar, no se si sea por las caracteristicas del servidor, si necesita mas ram o estoy manejando mal las transacciones en el sistema.
espero sus consejos...:)

duilioisola 25-11-2008 17:12:52

Yo trataría de ver cómo utilizas las transacciones...
- Si abres una al principio y la cierras al cerrar el programa: MAL ASUNTO!
- Mira la cantidad de transacciones abiertas en el SQL Server
- Trata de usar transacciones Read Only para las cosas que solo necesiten leer (listados por ejemplo)

look 25-11-2008 17:24:59

Cita:

Empezado por duilioisola (Mensaje 327864)
Yo trataría de ver cómo utilizas las transacciones...
- Si abres una al principio y la cierras al cerrar el programa: MAL ASUNTO!
- Mira la cantidad de transacciones abiertas en el SQL Server
- Trata de usar transacciones Read Only para las cosas que solo necesiten leer (listados por ejemplo)

esta es la manera como trabajo con las transacciones en un proceso comun
de guardar :

Código Delphi [-]
             if not (form13.Database1.InTransaction) then             form13.Database1.StartTransaction;
              try
            
            /// Proceso de Ejeccion de consultas para Postear la Informacion
            
  
  
            form13.Database1.Commit;
            except
            on E: Exception do
            begin
                  form13.database1.rollback;
                  Application.MessageBox( PChar( E.Message ), 'Ocurrio un Error De SQL',
                   MB_ICONSTOP );
                  exit;
            end;

            END;

Neftali [Germán.Estévez] 25-11-2008 17:29:57

A parte de lo dicho, yo echo en falta memoria para ese servidor (W2003 Server + SQL Server ==> 2 GB poco ;)).

Al precio que va hoy en día la RAM yo aumentaría esa cantidad.

Revisa tráfico de red y tiempos de respuesta, no sea que venga por ahí y no por el servidor en sí.

look 25-11-2008 17:37:56

Cita:

Empezado por Neftali (Mensaje 327868)
A parte de lo dicho, yo echo en falta memoria para ese servidor (W2003 Server + SQL Server ==> 2 GB poco ;)).

Al precio que va hoy en día la RAM yo aumentaría esa cantidad.

Revisa tráfico de red y tiempos de respuesta, no sea que venga por ahí y no por el servidor en sí.

Hola Neftali ,tomare en cuenta lo de la ram :), y con respecto a del trafico de red y tiempos de respuesta, mm como lo hago :), espero no molestarte con mi novatada pero... estoy aprendiendo :)

Neftali [Germán.Estévez] 25-11-2008 18:18:14

Aunque hay herramientas más sofisticadas, lo básico es comprobar que a medida queva cayendo el rendimiento los tiempos de respuesta del servidor son buenos (similares a cuando está recién arrancado); Los PING's deben ser similares.

En ese momento (de rendimiento bajo) puedes probar otras operaciones donde intervenga la red y comprobar la velocidad y tasa de transferencia.

Casimiro Notevi 25-11-2008 18:31:36

Cita:

Empezado por Neftali (Mensaje 327868)
A parte de lo dicho, yo echo en falta memoria para ese servidor (W2003 Server + SQL Server ==> 2 GB poco ;)).

Al precio que va hoy en día la RAM yo aumentaría esa cantidad.

Revisa tráfico de red y tiempos de respuesta, no sea que venga por ahí y no por el servidor en sí.


Aunque me temo que no va a poder aumentar mucho, sólo 1 gb más :)

Neftali [Germán.Estévez] 25-11-2008 18:46:08

Cita:

Empezado por Casimiro Notevi (Mensaje 327885)
Aunque me temo que no va a poder aumentar mucho, sólo 1 gb más :)


Casimiro Notevi 25-11-2008 19:06:27

¿Y qué es eso de PAE?, ¿algún PArchE? :)

poliburro 25-11-2008 23:25:54

Cita:

Empezado por look (Mensaje 327867)
esta es la manera como trabajo con las transacciones en un proceso comun
de guardar :


Código Delphi [-]
if not (form13.Database1.InTransaction) then form13.Database1.StartTransaction;
try

/// Proceso de Ejeccion de consultas para Postear la Informacion



form13.Database1.Commit;
except
on E: Exception do
begin
form13.database1.rollback;
Application.MessageBox( PChar( E.Message ), 'Ocurrio un Error De SQL',
MB_ICONSTOP );
exit;
end;

END;






No puedo creerlo :O :O, tienes Sql server 2000, y metes las transacciones en tus clientes :| :|.


El esquema adecuado es el siguiente:


Abre pantalla en el sistema

-- usuario realiza operaciones-
-- Creas tu datamodule y preparas tus Sps
-- Establececes conexión y ejecutas el sp (los bloques transaccionales están en los sps)
-- Cierras conexión
-- Destruyes el datamodule.


con esa estructura optimizas enormemente los recursos de tu servidor y de tus clientes.


Saludos. Ahhh no olvides darle mantenimiento diario a tu base e datos, respaldado y reduciendo el tamañoo del log (dbcc shrinkfile)

Saludos

look 25-11-2008 23:30:40

Cita:

Empezado por poliburro (Mensaje 327946)
No puedo creerlo :O :O, tienes Sql server 2000, y metes las transacciones en tus clientes :| :|.


El esquema adecuado es el siguiente:


Abre pantalla en el sistema

-- usuario realiza operaciones-
-- Creas tu datamodule y preparas tus Sps
-- Establececes conexión y ejecutas el sp (los bloques transaccionales están en los sps)
-- Cierras conexión
-- Destruyes el datamodule.


con esa estructura optimizas enormemente los recursos de tu servidor y de tus clientes.


Saludos. Ahhh no olvides darle mantenimiento diario a tu base e datos, respaldado y reduciendo el tamañoo del log (dbcc shrinkfile)

Saludos


Gracias amigo , Agradesco tu ayuda.
mmm, ¿que es un Sps?, si no es mucha la Molestia :)

poliburro 26-11-2008 00:25:36

Cita:

Empezado por look (Mensaje 327949)
Gracias amigo , Agradesco tu ayuda.
mmm, ¿que es un Sps?, si no es mucha la Molestia :)


Procedimientos almacenados

Neftali [Germán.Estévez] 26-11-2008 11:09:15

Cita:

Empezado por Casimiro Notevi (Mensaje 327895)
¿Y qué es eso de PAE?, ¿algún PArchE? :)

Exactamente; :D Phisical Address Extension; Vamos! un parche. Explicación.

lucasarts_18 26-11-2008 16:42:29

Cita:

Empezado por poliburro (Mensaje 327946)
No puedo creerlo :O :O, tienes Sql server 2000, y metes las transacciones en tus clientes :| :|.


El esquema adecuado es el siguiente:


Abre pantalla en el sistema

-- usuario realiza operaciones-
-- Creas tu datamodule y preparas tus Sps
-- Establececes conexión y ejecutas el sp (los bloques transaccionales están en los sps)
-- Cierras conexión
-- Destruyes el datamodule.


Amigo poliburro, difiero un poco de esto.

Qué pasa si de tu aplicación cliente llamas a 3 SP, y las transacciones las haces en el servidor. ponte en el caso que el 3 SP falle, ¿qué pasará?, ya que las transacciones de los dos primeros SP estarán materializadas en la base de datos. De esta forma no tienes forma de deshacer los cambios.

Yo manejos las transacciones en los clientes, en distintos lenguajes (Delphi, PowerBuilder, Php y con distintos motores (Oracle, SQL Server, etc..)) y nunca he tenido problemas de lentitud.

Saludos .-

poliburro 26-11-2008 22:22:55

Cita:

Empezado por lucasarts_18 (Mensaje 328090)
Amigo poliburro, difiero un poco de esto.

Qué pasa si de tu aplicación cliente llamas a 3 SP, y las transacciones las haces en el servidor. ponte en el caso que el 3 SP falle, ¿qué pasará?, ya que las transacciones de los dos primeros SP estarán materializadas en la base de datos. De esta forma no tienes forma de deshacer los cambios.

Yo manejos las transacciones en los clientes, en distintos lenguajes (Delphi, PowerBuilder, Php y con distintos motores (Oracle, SQL Server, etc..)) y nunca he tenido problemas de lentitud.

Saludos .-

la lógica entonces sería meter esos tres sps en un cuarto sp no? jajajaja. Amigo, soluciones hay muchas para esa situación. no aprovechar las características de atomicidad y transaccionalidad de motores como oracle o sql server es como utilizar un trailer para mudar una cama.

Ojo, eso está basado en mi propia experiencia. Igual en tu caso las cosas han funcionado maravillosamente bien, no tengo por que dudarlo pero para mi honestamente no aprovechar las ventajas del motor es un grave pecado.

Ejemplo:

Es como si para generar Xml de un recorset de sql server u oracle usaras delphi recorriendo todo el Dataset. :eek:. SQL server y Oracle ofrecen la generación de XML con una velocidad mucho mayor a la de delphi.


:) saludos.

lucasarts_18 27-11-2008 04:52:18

Cita:

Empezado por poliburro (Mensaje 328213)
la lógica entonces sería meter esos tres sps en un cuarto sp no? jajajaja. Amigo, soluciones hay muchas para esa situación. no aprovechar las características de atomicidad y transaccionalidad de motores como oracle o sql server es como utilizar un trailer para mudar una cama.

Hola, concuerdo contigo estimado poliburro no hay dudas que para eso están las bondades del motor de turno, solo es que no sé como solucionas el problema de los commit y rollback si de por si cada SP tiene su commit y rollback explícito.
A lo mejor hay algo que no sé y por eso sigo usando las transacciones desde el propio cliente.:(

Por otra parte el problema de nuestro amigo no creo que se deba al uso de estos desde el cliente, yo apuntaría a problemas de red (congestión) o quizás una mala gestión de las consultas SQL.

Saludos .-

poliburro 27-11-2008 15:48:04

Cita:

Empezado por lucasarts_18 (Mensaje 328267)

Por otra parte el problema de nuestro amigo no creo que se deba al uso de estos desde el cliente, yo apuntaría a problemas de red (congestión) o quizás una mala gestión de las consultas SQL.

Saludos .-

Coincido contigo amigo :), pueden ser varios factores que combinados dan por resultado la lentitud.

Saludos

look 27-11-2008 16:06:07

Cita:

Empezado por poliburro (Mensaje 328332)
Coincido contigo amigo :), pueden ser varios factores que combinados dan por resultado la lentitud.

Saludos

Totalmente deacuerdo, a esa conclusion queria llegar, bueno ,tendre que re-estructurar la programacion para solucionar el problema :), gracias compañeros por sus comentarios.

mamcx 27-11-2008 16:24:27

Esto es mas o menos facil de resolver.

1. El asunto de las transacciones en cliente o en servidor es de poca monta aqui. Solo se afecta fuertemente en el caso de mucha concurrencia.

Aunque los SP sean un poco mas eficientes, en la experiencia no es tanta la diferencia con respecto a los procesos que usualmente hace una app tipo CRUD. Sin embargo, si son procesos en batch si es mejor asi.

Por el manejo de las transacciones como tal, no hay problema desde que se especifique adecuadamente el nivel de aislamiento de transacciones.

2. Sql Server *por defecto* esta diseñado para ser instalado de forma exclusiva en un servidor. O sea, se presupone que la BD esta en 1 servidor, la aplicacion en otro, el domino activo en otro, etc...

Por la configuracion del servidor puedes especificar el limite de memoria de sql server:

http://msdn.microsoft.com/en-us/library/ms178067.aspx

3. Optimiza el windows, cerrando servicios inutiles en un servidor (como el de camaras digitales):

http://www.optimizingpc.com/optimize...sservices.html
http://www.extremetech.com/article2/0,2845,5155,00.asp

4. Puede que la red este mal configurada. Es muy comun, y si ademas tienen el directorio activo en ese equipo es probable que no lo hayan montado correctamente.

Para mas info, este es el mejor sitio:

http://www.windowsnetworking.com/

5. Si tienen Exchange instalado por casualidad, es un animal traga-todo. Mejor muevanlo a otro equipo o salgan de ese engendro del demonio.

6. Ya que tienes la dicha de 2 discos SCSI, si no estan en RAID entonces pon el archivo de la BD en un disco (el de sistema) y del LOG en el otro (el de datos). Es mas importante poner el de Log en el disco que menos se mueva.

Puedes chequear el performance de Sql server con las herramientas de monitoreo que trae, sobre todo el Sql Profiler: Es super bueno. Te logea todas las llamadas al sql y puedes hacer uso del sql query analyzer para chequear cuales sql son los lentos.

Por lo demas, mira si todo lo que debe estar indexado lo esta y recuerdan que tambien se pueden indexar las Vistas, eso ayuda mucho SI tienes informes por vistas que son muy pesados.

Pero con todo, optimizar el sistema, deshabilitar servicios, que no corran menssenger ni ñoñadas y poner la BD y el LOG en discos separados es mas que suficiente.

Ya en el lado de delphi:

1. Utiliza cursores del lado CLIENTE y tipo READONLY. Mira si puedes usar FORWARD-ONLY en algunos casos.

2. Coje los sql mas complejos y vuelvelos Vistas. Mas simple de programar y hay mas desempeño.

3. Pasar todo a SP no necesariamente sea lo mejor, igual, lo que describes no es PARA NADA una situacion donde el desempeño haya que llevarlo al limite. De hecho, me parece raro que se te esten quejando.

Quizas, el problema estan en las estaciones. Quizas tienen mucho spyware & ñoñadas o son equipos muy lentos?

Si necesitas tirar mas desempeño me avisas. Pero primero, revisa los pasos anteriores y usa el query analyzer y el performance monitor de Windows:

http://www.windowsnetworking.com/art...e_Monitor.html

Para ver donde realmente esta la situa.

P.D: Solucion rapida: 1 Desactiva servicios. 2. BD & Log separados 3. Dataset lado cliente, solo lectura 4. SQL complejos en vistas. 5. Tira todo en batchs tanto como se pueda.

look 27-11-2008 16:36:48

Cita:

Empezado por mamcx (Mensaje 328345)
Esto es mas o menos facil de resolver.

1. El asunto de las transacciones en cliente o en servidor es de poca monta aqui. Solo se afecta fuertemente en el caso de mucha concurrencia.

Aunque los SP sean un poco mas eficientes, en la experiencia no es tanta la diferencia con respecto a los procesos que usualmente hace una app tipo CRUD. Sin embargo, si son procesos en batch si es mejor asi.

Por el manejo de las transacciones como tal, no hay problema desde que se especifique adecuadamente el nivel de aislamiento de transacciones.

2. Sql Server *por defecto* esta diseñado para ser instalado de forma exclusiva en un servidor. O sea, se presupone que la BD esta en 1 servidor, la aplicacion en otro, el domino activo en otro, etc...

Por la configuracion del servidor puedes especificar el limite de memoria de sql server:

http://msdn.microsoft.com/en-us/library/ms178067.aspx

3. Optimiza el windows, cerrando servicios inutiles en un servidor (como el de camaras digitales):

http://www.optimizingpc.com/optimize...sservices.html
http://www.extremetech.com/article2/0,2845,5155,00.asp

4. Puede que la red este mal configurada. Es muy comun, y si ademas tienen el directorio activo en ese equipo es probable que no lo hayan montado correctamente.

Para mas info, este es el mejor sitio:

http://www.windowsnetworking.com/

5. Si tienen Exchange instalado por casualidad, es un animal traga-todo. Mejor muevanlo a otro equipo o salgan de ese engendro del demonio.

6. Ya que tienes la dicha de 2 discos SCSI, si no estan en RAID entonces pon el archivo de la BD en un disco (el de sistema) y del LOG en el otro (el de datos). Es mas importante poner el de Log en el disco que menos se mueva.

Puedes chequear el performance de Sql server con las herramientas de monitoreo que trae, sobre todo el Sql Profiler: Es super bueno. Te logea todas las llamadas al sql y puedes hacer uso del sql query analyzer para chequear cuales sql son los lentos.

Por lo demas, mira si todo lo que debe estar indexado lo esta y recuerdan que tambien se pueden indexar las Vistas, eso ayuda mucho SI tienes informes por vistas que son muy pesados.

Pero con todo, optimizar el sistema, deshabilitar servicios, que no corran menssenger ni ñoñadas y poner la BD y el LOG en discos separados es mas que suficiente.

Ya en el lado de delphi:

1. Utiliza cursores del lado CLIENTE y tipo READONLY. Mira si puedes usar FORWARD-ONLY en algunos casos.

2. Coje los sql mas complejos y vuelvelos Vistas. Mas simple de programar y hay mas desempeño.

3. Pasar todo a SP no necesariamente sea lo mejor, igual, lo que describes no es PARA NADA una situacion donde el desempeño haya que llevarlo al limite. De hecho, me parece raro que se te esten quejando.

Quizas, el problema estan en las estaciones. Quizas tienen mucho spyware & ñoñadas o son equipos muy lentos?

Si necesitas tirar mas desempeño me avisas. Pero primero, revisa los pasos anteriores y usa el query analyzer y el performance monitor de Windows:

http://www.windowsnetworking.com/art...e_Monitor.html

Para ver donde realmente esta la situa.

P.D: Solucion rapida: 1 Desactiva servicios. 2. BD & Log separados 3. Dataset lado cliente, solo lectura 4. SQL complejos en vistas. 5. Tira todo en batchs tanto como se pueda.

Gracias compañero , Voy aprobar cada uno de estos pasos, como lo detallas aqui :), tengo bastante que hacer ... :rolleyes:, pues luego les aviso como me fue.


La franja horaria es GMT +2. Ahora son las 02:57:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi