1

我使用这段代码:

    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 接收到的所有数据)。

4

2 回答 2

4

有各种性能部分ExecuteReader

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

根据您的描述,这听起来像是第一个问题。这与 ADO.NET 完全无关,的查询有关。所以:写一个更好的查询,或者添加适当的索引。

其他可能影响这一点的事情:

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

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

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

于 2013-01-02T09:17:51.020 回答