【问题标题】:Is SQLDataReader slower than using the command line utility sqlcmd?SQLDataReader 是否比使用命令行实用程序 sqlcmd 慢?
【发布时间】:2010-05-14 00:28:08
【问题描述】:

我最近向一位同事提倡我们将一些使用 sqlcmd 命令行实用程序的 C# 代码替换为 SqlDataReader。旧代码使用: System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c" + sqlCmd); sqlCmd 类似于 "sqlcmd -S " + serverName + " -y 0 -h-1 -Q " + "\"" + "USE [" + 数据库 + "]" + ";+ txtQuery.Text +"\"";\

然后使用正则表达式解析结果。我认为使用 SQLDataReader 会更符合行业惯例,更易于调试和维护并且可能更快。但是,SQLDataReader 方法的速度至少相同,而且很可能更慢。我相信我用 SQLDataReader 做的一切都是正确的。代码是:

using (SqlConnection connection =
         new SqlConnection())
        {
            try
            {
                SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
                connection.ConnectionString = builder.ToString(); ;
                SqlCommand command =
                    new SqlCommand(queryString, connection);

                connection.Open();



                SqlDataReader reader = command.ExecuteReader();

    // do stuff w/ reader 
                reader.Close();

            }
            catch (Exception ex)
            {
                outputMessage += (ex.Message);
            }
        } 

我使用 System.Diagnostics.Stopwatch 对这两种方法进行计时,命令行实用程序(从 C# 代码调用)似乎更快(20-40%?)。 SqlDataReader 有一个简洁的特性,即当再次调用相同的代码时,它的速度很快,但对于这个应用程序,我们没有预料到。

我已经对这个问题进行了一些研究。我注意到命令行实用程序 sqlcmd 使用 OLE DB 技术来访问数据库。这比 ADO.NET 快吗?我真的很惊讶,特别是因为命令行实用程序方法涉及启动一个进程。我真的以为它会更慢。

有什么想法吗?

谢谢, 戴夫

【问题讨论】:

  • // do stuff w/ reader 可能很重要。里面有什么?
  • 20-40% 重要吗?我们是在谈论一个需要 500 毫秒而另一种方式需要 600 毫秒的过程吗?还是几秒钟或更长时间?
  • Sam,300 左右与 350 到 600 之间的差异(取决于谁在进行测试。我相信我读到人类无法感知少于 200 毫秒,所以有一些担忧。在用户单击“显示结果”按钮时检索此数据。在此之前很难获取数据,因为他可能会在最后一刻更改它。坦率地说,我很惊讶 SQLDataReader 是没有那么快或更快,但请参阅 TimLi 的答案(DataReader 也正在获取架构信息)。do stuff /w 阅读器非常快(

标签: sqldatareader sqlcmd


【解决方案1】:

我认为 SqlDataReader 比 sqlcmd 慢,因为制作 SqlDataReader 不仅可以获取数据,还可以获取数据库架构信息,而 sqlcmd 只获取数据。 您可以使用这样的数据读取器获取列名:

for (int i = 0; i < reader.FieldCount; i++)
{
    Console.WriteLine(reader.GetName(i));
}

有时性能并不重要,安全性更重要。 但是不知道哪个更安全,可能是SqlDataReader。

我是中国人,所以可能我的语法不正确,对不起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    相关资源
    最近更新 更多