Anuncios

viernes, 30 de septiembre de 2011

CLR vs. T-SQL y Procedimientos almacenados en SQL Server


CLR o TSQL? Esa es la cuestion.


Cada vez más y más programadores se queman las pestañas tratando de encontrar la respuesta. Pero la respuesta en realidad depende de las necesitades del propramador.

Para tareas SQL rutinarias, TSQL es lo recomendado. Mientras que CLR es la mejor opción para cálculos, parsing, procesamiento de imágenes y otras tareas que manejan un número limitado de datos.

En un experimento realizado por sqlsolutions para comparar ambas opciones y se encontró que CLR era muy superior utilizando una Pentium 4 de 2.4 GHz y con 1 Gb de RAM.


En el experimento se creó una simple funcion T-SQL que sumaba 2 números. A continuación se muestra la función:


CREATE FUNCTION FuncSum(@n1  
INT, @n2 INT)
RETURNS INT AS
BEGIN  
RETURN @n1 + @n2 END


Posteriormente se escribió el código en CLR para el mismo cálculo (que evidentemente es más complejo):
 
using System;
using Microsoft.SqlServer.Server;

public class TestProcedures
{
    [Microsoft.SqlServer.Server.SqlFunction( 
    IsDeterministic = true, DataAccess = DataAccessKind.Read )]
    [CLSCompliant( false )]
    public static int FuncSum_CLR(int n1, int n2)
    {
        return n1 + n2;
    }
}
 
Luego se lo agregó a la base de datos:
CREATE ASSEMBLY SQL2005_Assembly
    FROM 
'C:\Documents and Settings\User\My Documents\Visual Studio 2005\Projects\
SQL2005_Assembly\bin\Release\SQL2005_Assembly.dll'
    WITH PERMISSION_SET = UNSAFE

CREATE FUNCTION FuncSum_CLR
    (
        @n1 int, @n2 int
    )
    RETURNS int
    AS EXTERNAL NAME SQL2005_Assembly.TestProcedures.FuncSum_CLR


Finalmente se corrió la función 100000 veces
 
CREATE PROCEDURE TestFuncSum(_CLR)
AS
BEGIN
    DECLARE @t datetime
    SET @t = getdate()
    DECLARE @n INT
    DECLARE @i INT
    SET @i = 0
    WHILE (@i <100000)
    BEGIN
        EXEC @n = FuncSum(_CLR) 1,1
        SET @i = @i + 1
    END
    SELECT datediff(ms, @t, getdate())
END
Los resultados fueron los siguientes:
  • TSQL: 2000ms
  • CLR: 6300ms
El experimento muestra que CLR es 3 veces más lento que TSQL.
Los números lo dicen todo.

Extraído y traducido de sqlsolutions

People who read this post also read :