我使用以下代码:
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
循环内的代码)的性能
其他可能影响这个的因素:
- 高服务器负载/网络负载
- 来自其他连接的锁定
- 不同的
SET
配置(ADO。. NET对SSMS窗口有不同的SET
默认值,因此在某些情况下性能可能会有很大差异) - 参数嗅;如果您在某个点运行非典型查询(非常有偏差的数据),则可能缓存错误的查询计划-在这种情况下,
OPTIMIZE FOR
查询提示可以提供帮助,如果
如果ExecuteReader()
是你的性能瓶颈,那么你需要编写更好的SQL查询,更好地组织数据库中的数据(例如设置索引),并通常优化数据库上的东西。
您不能在客户端做太多事情,因为ExecuteReader()
基本上只是将查询发送到数据库并等待结果到达。