存储过程不那么快?

时间:2009-11-25 13:24:23

标签: c# sql stored-procedures

Hoho那里。

我只是想通过使用存储过程来提高应用程序的性能(.NET 3.5,C#)。

所以我写了一个小测试应用程序,看看它们与普通查询相比有多快,如下所示:

    private static long _StartStored;
    private static long _EndStored;
    private static long _StartNormal;
    private static long _EndNormal;
    private static TimeSpan _StoredTime;
    private static TimeSpan _NormalTime;
    private static string[] _Stored = new string[102000];
    private static string[] _Normal = new string[102000];
    static void Main(string[] args)
    {
        Console.WriteLine("Querying 2000 normal queries");
        _SQLConnection = new SqlConnection(/*my_connection*/);
        _SQLConnection.Open();
        _StartNormal = DateTime.Now.Ticks;
        for (int i = 100000; i <= 102000; i++)
        {
            DataTable _ResultDataTable = new DataTable();
            SqlDataAdapter _SQLAdapter = new SqlDataAdapter(/*my_query*/, _SQLConnection);
            _SQLAdapter.Fill(_ResultDataTable);
            if (_ResultDataTable.Rows.Count > 0)
                _Normal[i] = _ResultDataTable.Rows[0]["row"].ToString();
        }
        _EndNormal = DateTime.Now.Ticks;
        _NormalTime = TimeSpan.FromTicks(_EndNormal - _StartNormal);
        Console.WriteLine("Total execution time: " + _NormalTime.ToString());
        //-----------------------------------------------------------------------------
        Console.WriteLine("Querying 2000 stored procedures");
        _StartStored = DateTime.Now.Ticks;
        SqlCommand _Cmd = new SqlCommand(/*my_sp*/, _SQLConnection);
        _Cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter _Param = new SqlParameter("@param1", 0);
        _Cmd.Parameters.Add(_Param);
        for (int i = 100000; i <= 102000; i++)
        {
            _Cmd.Parameters["@param1"].Value = i;
            SqlDataReader _Reader = _Cmd.ExecuteReader();
            while (_Reader.Read())
            {
                _Stored[i] = _Reader["StartWork"].ToString();
            }
            _Reader.Close();
        }
        _EndStored = DateTime.Now.Ticks;
        _StoredTime = TimeSpan.FromTicks(_EndStored - _StartStored);
        Console.WriteLine("Total execution time: " + _StoredTime.ToString());

我很想缩短代码,但是......不起作用:D

TL; DR - 2000相同查询的存储过程只快4秒左右,这对我来说似乎很低?

我使用存储过程是错误的吗?

7 个答案:

答案 0 :(得分:10)

大部分开销都是设置存储过程调用并检索结果 - 在您的示例中完成了2000次。

您可能需要考虑将循环移动到存储过程中,然后调用存储过程一次并一次性获取所有结果。

答案 1 :(得分:6)

我同意杰里米的观点。使用存储过程的一个更好的原因是避免在循环中调用数据库不可预测的次数。您应该将循环移动到存储过程本身并调用一次。因此,您的示例显示存储过程的使用率很低。有点像在拖拉机上驾驶拖拉机和法拉利,然后声称法拉利很慢。

答案 2 :(得分:3)

对于新版本的SQL Server,SP和普通代码之间的差异非常小,SQL Server优化了任何查询的优势,特别是如果命令没有改变。

答案 3 :(得分:3)

db的一次 BIG 行程几乎总是比循环中的同一行程更快。

如果您要在数据库本身中进行tyhe循环,那么您将大大提高性能。

答案 4 :(得分:0)

答案 5 :(得分:0)

答案 6 :(得分:0)

您应该始终使用参数化查询,因此您可能根本看不到任何速度差异。