SqlDataAdapter.Fill 即使是一条记录也太慢了

Posted

技术标签:

【中文标题】SqlDataAdapter.Fill 即使是一条记录也太慢了【英文标题】:SqlDataAdapter.Fill is too slow even for one record 【发布时间】:2012-01-04 14:21:57 【问题描述】:

我在 MS SQL 2005 中有一个带有主键的表,它有几十万条记录。当我在 Management Studio 中查询它以获取记录时,它带来的速度非常快,但是当我使用下面的代码查找它时,它需要很多秒。我必须使用数据集,因为我需要更新行。如何提高性能?

objData . ProcName ="myProcName"
objData . CreateCommand()
objData . Parameters("@BName", SqlDbType. VarChar, 20, "MyBranch1")
SqlDataAdapter da = objData . createAdapter()
da . Fill(ds,"MyTable1")

虽然proc代码很简单:

select * from MyTable1 Where BranchName = @BName

这个数据集将以相同的方式打开 5 个表,因此总时间超过一分钟

【问题讨论】:

Datareader 是最佳选择:msdn.microsoft.com/en-us/library/haa3afyz%28v=VS.100%29.aspx 【参考方案1】:

您应该考虑使用 datareader 而不是 dataset 并使用 sqlcommand 进行手动更新。

您还应该考虑通过可能提供其他条件来限制您获取的记录数

【讨论】:

那么你是说数据集不可能有更好的性能?而且我使用了足够的标准,因为数据集中的 5 个数据表中的每一个都不包含超过 5 行 当你使用数据读取器时,它一次移动一条记录,而在数据适配器和数据集的情况下,适配器只是获取所有记录并为其创建数据行对象(以及约束和关系,取决于它是否输入数据集与否)此对象创建需要更多时间,这与您拥有的记录数量成正比。那是webapp还是windows应用?我可能会根据你的工作告诉你具体的方法 这是 webapp,我希望在不更改太多代码的情况下提高性能。但是,如果不可能,那么我会直接将其更改为数据阅读器。您对 DataRow 对象等是正确的。我们可以设置一些属性或其他东西来忽略数据集中的约束和关系吗? 我记得数据集中有一个属性叫做 ignoreconstraints。检查并确认。我已经使用域模型很长时间了,所以开始有点忘记数据集了【参考方案2】:

我看到使用 SQLDataAdapter 的延迟行为非常相似,它需要几秒钟才能返回响应,而在 SQL Server Mgmt Studio 中(在同一台客户端计算机上)运行完全相同的过程会立即返回响应。

我在受影响的表上重建了索引,然后来自 SQLDataAdapter 的响应是即时的。

我从未见过 SQLDataReader 出现这种延迟行为。我经常使用 SQLDataReader,只做一个 MyTable.Load(mysqlDataReader)。它的开销似乎比 SQLDataAdapter 少。

【讨论】:

以上是关于SqlDataAdapter.Fill 即使是一条记录也太慢了的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataAdapter.Fill() 溢出异常

SqlDataAdapter.Fill(DataGridView.DataSource) 复制所有行

SqlClient.SqlDataAdapter.Fill(DataSet) 结果如果不选择查询

SqlDataAdapter.Fill 方法慢

SqlDataAdapter.Fill 方法慢

SqlDataAdapter#Fill:`SelectCommand.connection` 属性尚未初始化