none
Ejecucion de procedimiento almacenado RRS feed

  • Pregunta

  • Que tal comunidad..

    Mi duda es la siguiente: Cual es la mejor forma, en cuanto a mejorar el rendimiento, de ejecutar un procedimiento almacenado en Visual Basic .NET con SQL server 2005?.. se de dos posibles maneras:

    Dim claveModDep As Integer
    
                Dim parametro As New SqlParameter
    
                Dim parametro2 As New SqlParameter
    
                comando = New SqlCommand("obten_mod_dep ", conSQL.getCon())
    
                comando.CommandType = CommandType.StoredProcedure
    
                parametro = New SqlParameter("@dep", SqlDbType.Int)
    
                parametro.Direction = ParameterDirection.Input
    
                comando.Parameters.Add(parametro)
    
                parametro2 = New SqlParameter("@mod", SqlDbType.Int)
    
                parametro2.Direction = ParameterDirection.Input
    
                comando.Parameters.Add(parametro2)
    
                comando.Parameters("@dep").Value = cmb_dep.SelectedValue
    
                comando.Parameters("@mod").Value = cmb_modalidad.SelectedValue
    
    
    
                claveModDep = comando.ExecuteScalar  'Ejecutar consulta
    
    


    o simplemente:

    Dim claveModDep As Integer
    
                comando.Connection = conSQL.getCon()
    
                comando.CommandText = "EXEC obten_mod_dep " & cmb_dep.SelectedValue & ", " & cmb_modalidad.SelectedValue & ";"
    
                claveModDep = comando.ExecuteScalar  'Ejecutar consulta
    
    


    En cuanto a optimizar el rendimiento.. cual deberia utilizar.. o existe alguna mejor?.. Gracias
    martes, 7 de abril de 2009 22:47

Respuestas

  • :-)
    Hola,

    En términos de rendimiento apenas hay diferencia. He creado un pequeño programa que usa ambos métodos para acceder al procedimiento almacenado dbo.GetOrdersByDate de la BD Northwind, y mediante la herramienta SQL Profiler he podido constatar que internamente al servidor SQL le llega lo siguiente:

    Método 1:

    private void button1_Click(object sender, EventArgs e)
    
            {
    
                using (SqlConnection con = new SqlConnection(getConnection()))
    
                {
    
                    con.Open();
    
                    using (SqlCommand cmd = new SqlCommand(
    
                        "EXEC dbo.GetOrdersByDate 1, '19970601', 0", con))
    
                    {
    
                        SqlDataReader dr = cmd.ExecuteReader();
    
                        while (dr.Read())
    
                        {
    
                            Console.WriteLine(dr["OrderId"].ToString());
    
                        }
    
                        dr.Close();
    
                    }
    
                    con.Close();
    
                }
    
            }
    
    

    Al servidor le llega lo siguiente:

    EXEC dbo.GetOrdersByDate 1, '19970601', 0
    
    

    Método 2:

    private void button2_Click(object sender, EventArgs e)
    
            {
    
                using (SqlConnection con = new SqlConnection(getConnection()))
    
                {
    
                    con.Open();
    
                    using (SqlCommand cmd = new SqlCommand(
    
                        "dbo.GetOrdersByDate", con))
    
                    {
    
                        cmd.CommandType = CommandType.StoredProcedure;
    
                        SqlParameter p1 = new SqlParameter("@ProductId", 1);
    
                        cmd.Parameters.Add(p1);
    
                        SqlParameter p2 = new SqlParameter("@Date", new DateTime(1997, 6, 1));
    
                        cmd.Parameters.Add(p2);
    
                        SqlParameter p3 = new SqlParameter("@Tot", 0);
    
                        p3.Direction = ParameterDirection.Output;
    
                        cmd.Parameters.Add(p3);
    
                        SqlDataReader dr = cmd.ExecuteReader();
    
                        while (dr.Read())
    
                        {
    
                            Console.WriteLine(dr["OrderId"].ToString());
    
                        }
    
                        dr.Close();
    
                    }
    
                    con.Close();
    
                }
    
            }
    
    

    Al servidor SQL le llega:

    declare @P1 bigint
    
    set @P1=3370
    
    exec dbo.GetOrdersByDate @ProductId = 1, @Date = 'Jun  1 1997 12:00:00:000AM', @Tot = @P1 output
    
    select @P1
    
    

    Si comparas los planes de ejecución verás que el costo estimado es el mismo, y en principio al ser ambos procedimientos almacenados, los dos planes de ejecución se cachean por igual.

    Eso si, las ventajas de usar el segundo método es que te permiten obtener los valores de los parámetros (de output) con mayor facilidad, y en este caso creo que es una ventaja. Además, al no usar concatenación para montar la cadena EXEC ...... te ahorras los posibles problemas derivados de una posible inyección de SQL.

    Particularmente te recomiendo usar la segunda aproximación, aunque no por rendimiento.
    Saludos desde Andorra,


    [MS-MVP-MCTS]

    Mi Perfil MVP en: https://mvp.support.microsoft.com/profile/Lluis
    NUG: http://andorradotnet.com
    Web: http://www.ordeeno.com
    Blog: http://msmvps.com/blogs/lfranco
    Geeks: http://geeks.ms/blogs/lfranco

    • Propuesto como respuesta Erick Pimienta jueves, 9 de abril de 2009 16:58
    • Marcado como respuesta J Antonio 09 lunes, 13 de abril de 2009 23:13
    miércoles, 8 de abril de 2009 13:21
    Moderador