比.net中的SqlConnection和SqlDataReader更快



我使用以下代码:

    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收到的所有内容)。

ExecuteReader有各种性能部件:

  • 查询本身的性能(这特别影响延迟,即ExecuteReader开始获取数据所需的时间)
  • 返回的数据量(这会影响带宽,行计数和While循环的迭代次数)
  • 行处理代码(While循环内的代码)的性能
从你的描述来看,第一个似乎是问题所在。与ADO完全没有关系。. NET和与查询有关的一切。所以:写一个更好的查询,或者添加适当的索引。

其他可能影响这个的因素:

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

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

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

相关内容

  • 没有找到相关文章

最新更新