Usar o no usar Stored Procedures en un ambiente distribuido

60 views
Skip to first unread message

Analyzer

unread,
Aug 16, 2013, 10:32:09 AM8/16/13
to PHP Latinoamérica
Me llama la atención este párrafo del manual de MySql:

Los procedimientos almacenados pueden mejorar el rendimiento ya que se necesita enviar menos información entre el servidor y el cliente. El intercambio que hay es que aumenta la carga del servidor de la base de datos ya que la mayoría del trabajo se realiza en la parte del servidor y no en el cliente. Considere esto si muchas máquinas cliente (como servidores Web) se sirven a sólo uno o pocos servidores de bases de datos.



¿Es conveniente usar los SP en ambientes tipo web?..

Es decir, miles de usuarios concurrentes visitando e enviando datos al servidor de datos de un site?..

Saludos!

Erwin Vera (gmail)

unread,
Aug 16, 2013, 10:06:12 PM8/16/13
to phplatin...@googlegroups.com

Mi experiencia ha sido que son mucho más eficientes y veloces que los desarrollos del lado del cliente, el asunto es que si realmente tu BD es usada  por muchos usuarios, estamos hablando de miles a millones, se pone muy lento en caso de no tener una distribución eficiente de la información, pero para llegar a esos número tendrías que estar trabajando con una empresa de mediano a gran tamaño. Te envío un ejemplo de un SP o procedimiento almacenado (PA) que me devuelve un cursor para luego poder trabajar con esa información, al no usar comandos de VFP sino invocar la consulta (select) del lado del servidor la curva de respuesta es muy alta!

USE [EMPRESAXXX]  

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:                    Erwin Vera

-- Create date: 01-08-2013

-- Description:  SP que arma cursor con los movimiento de asistencia

-- =============================================

IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME='PA_asistencias')

   DROP PROCEDURE PA_asistencias;

GO

CREATE PROCEDURE [dbo].[PA_asistencias]

            @cCodTra as varchar(10),

            @fDesde as datetime,

            @fHasta as datetime

       AS

BEGIN

    declare @fVacia as datetime

    set @fVacia  = ''

    SELECT CODTRA,DESDE,HASTA,TIPO,REMUNERADO,CANTIDAD,FECHANOM,cestaticket

      FROM REMHISREP

     WHERE CODTRA=@cCODTRA AND ((FECHANOM>=@fDesde AND FECHANOM<=@fHasta)

           OR (((DESDE>=@fDesde AND DESDE<=@fHasta)

           OR (HASTA>=@fDesde AND HASTA<=@fHasta)

           OR (DESDE<=@fDesde AND HASTA>=@fHasta)) AND FECHANOM=@fVacia ))

END

GO

Este otro SP hace una actualización de sueldos planificados en una tabla de trabajadores de manera que se puedan realizar los cambios a través de algún planificador, sea de BD o de cualquier lenguaje de programación con posibilidades de invocar comandos de la BD :

USE [EMPRESAXXX]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:                    Erwin Vera

-- Create date: 19-09-2012

-- Description:  Ejecuta los cambios de sueldos registrados en el histórico de sueldo HISSUELDO

-- =============================================

CREATE PROCEDURE [dbo].[PA_SUELDOAUTO]

AS

BEGIN

   SET NOCOUNT ON;

    --- cambio de sueldo automático del maestro de trabajadores de acuerdo a

    --- lo planificado o indicado en el histórico de sueldos

    ---

    DECLARE @LAFECHA AS DATETIME

    SELECT @LAFECHA = GETDATE() --'05-09-2009' --

    SELECT a.codtra,a.apellido,.a.nombre,a.fecha_ing,a.sueldo,

           isnull((SELECT TOP 1 SUELDO FROM HISSUELDO WHERE CODTRA=A.CODTRA and FECHA <= @LAFECHA ORDER BY FECHA DESC),0) AS NEWSUELDO,

           isnull((SELECT TOP 1 FECHA FROM HISSUELDO WHERE CODTRA=A.CODTRA and FECHA <=@LAFECHA ORDER BY FECHA DESC),0)  AS fecha,

           isnull((SELECT TOP 1 FECHA FROM HISSUELDO WHERE CODTRA=A.CODTRA ORDER BY FECHA DESC),0)  AS ULTfecha

      INTO #TEMPORAL

      FROM REMCTATRA A

     WHERE CODTRA IN (SELECT TOP 1 CODTRA FROM HISSUELDO WHERE CODTRA=A.CODTRA AND FECHA <= @LAFECHA ORDER BY FECHA DESC);

    -- Actualizando según resultado del temporal

    UPDATE REMCTATRA SET SUELDO = (SELECT NEWSUELDO FROM #TEMPORAL WHERE CODTRA=REMCTATRA.CODTRA AND SUELDO<>NEWSUELDO )

     WHERE CODTRA IN (SELECT CODTRA FROM #TEMPORAL WHERE SUELDO<>NEWSUELDO );

    SELECT * FROM HISSUELDO A WHERE A.CODTRA IN (SELECT CODTRA FROM #TEMPORAL WHERE CODTRA=A.CODTRA AND SUELDO<>NEWSUELDO) ORDER BY CODTRA,FECHA DESC

    DROP TABLE #TEMPORAL

END

GO

--
Has recibido este mensaje porque estás suscrito al grupo "PHP Latinoamérica" de Grupos de Google.
Visita este grupo en http://groups.google.com/group/phplatinoamerica.

Yo

unread,
Aug 16, 2013, 10:35:25 PM8/16/13
to phplatin...@googlegroups.com
Depende de muchas cosas.

Lo habitual es usar store procedures SOLO cuando es necesario (por ej. en grandes procesos de actualización).
Para las queries "pequeñas" no trae ninguna ventaja evidente. Además que si estas usando una capa de abstracción a la DB (como Active Record) no tiene sentido.
Los store procedures no son iguales para todas las bases de datos. Muchas veces entre versiones de la misma base también cambian.
Saludos

Yo

Hansel Adolfo Vielman Blanco

unread,
Aug 17, 2013, 11:07:55 AM8/17/13
to phplatin...@googlegroups.com
En mi experiencia, yo si los utilizo y bastante, lo importante no es usarlos o no, la respuesta es si, pero todo depende de como los utilices, si dentro de este procedimiento utilizas consultas demasiado complejas que hacen que se demoren demasiado en responder y este sabes que sera utilizado por miles de visitantes en tu site, por supuesto que te traera consecuensias grabes en el rendimiento de tu pagina.

Sin embargo si lo utilizas adecuadamente es muy probable que hasta la navegacion en la misma sea mucho mas eficiente sobretodo si haces inserts o updates en cadena (para un maestro detalle por ejemplo.).


--
Has recibido este mensaje porque estás suscrito al grupo "PHP Latinoamérica" de Grupos de Google.
Visita este grupo en http://groups.google.com/group/phplatinoamerica.



--




Atte.
Adolfo Vielman

Analyzer

unread,
Aug 17, 2013, 3:10:47 PM8/17/13
to PHP Latinoamérica
Erwin, 

Gracias por compartir tu metodología..


Saludos!

Analyzer

unread,
Aug 17, 2013, 3:11:34 PM8/17/13
to PHP Latinoamérica
Usuario YO,

Te agradezco tus notas..


Saludos!


--

Analyzer

unread,
Aug 17, 2013, 3:15:51 PM8/17/13
to PHP Latinoamérica
Hansel,

Gracias por eso del "depende". Ya lo decían los huevo cartoons..



Saludos!
Reply all
Reply to author
Forward
0 new messages