比.net中的SqlConnection和SqlDataReader快

时间:2013-01-02 09:13:21

标签: .net sqldatareader sqlconnection

我使用此代码:

    Dim connection As SqlConnection
Dim connetionString As String
Dim sqlq As String = "select c.* from(..."
    connetionString = "Data Source=...;Initial Catalog=...;User ID=...;Password=..."
    connection = New SqlConnection(connetionString)
                track3.Text = "Connection... " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
        Using connection
            connection.Open()
                track4.Text = "SqlCommand... " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
            Dim command As SqlCommand = New SqlCommand(sqlq, connection)
                track5.Text = "SqlDataReader... " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
            Dim reader As SqlDataReader = command.ExecuteReader()
                track6.Text = "Filling RTB... " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
            If reader.HasRows Then
                ........
                Do While reader.Read()
                    .......
            reader.Close()
        End Using
                track7.Text = "Done " & DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")

我注意到命令'command.ExecuteReader()'消耗大部分时间。这个时间范围有时在1到19秒之间,这对我来说太长了。有没有更好的方法来做我做的事情?我需要从数据库中读取一些数据并在富文本框中显示它(不是从DB接收的所有内容)。

2 个答案:

答案 0 :(得分:4)

ExecuteReader有各种各样的表现部分:

  • 查询本身的性能(特别会影响延迟,即ExecuteReader 启动获取数据所需的时间)
  • 返回的数据量(这会影响带宽,行数和While循环的迭代次数)
  • 行处理代码(While循环内的代码)
  • 的性能

从你的描述中,听起来首先是问题。这与ADO.NET有绝对没有,而所有与您的查询有关。所以:写一个更好的查询,或添加适当的索引。

可能影响此事的其他因素:

  • 高服务器负载/网络负载
  • 从其他连接锁定
  • 不同的SET配置(ADO.NET与SSMS窗口的默认值不同SET,因此在某些情况下性能会有很大差异)
  • 参数嗅探;如果您在某个时刻运行非典型查询(非常有偏见的数据),则可以缓存错误的查询计划 - 在这种情况下OPTIMIZE FOR查询提示可以提供帮助,如果您已确认参数嗅探是个问题。

答案 1 :(得分:2)

如果ExecuteReader()是您的性能瓶颈,那么您需要编写更好的SQL查询,更好地组织数据库中的数据(例如设置索引),并通常优化数据库上的内容。

你不能在客户端做很多事情因为ExecuteReader()基本上只是将查询发送到数据库并等待结果到达。