SqlDataAdapter.Fill即使对于一个记录也太慢了

6

我在MS SQL 2005中有一张带有主键的表,它有几十万条记录。当我在管理工具中查询一条记录时,它非常快,但是当我使用下面的代码查找时,需要花费很多秒钟。由于需要更新行,我必须使用数据集。如何提高性能?

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

虽然处理代码很简单:

select * from MyTable1 Where BranchName = @BName

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


1
Datareader 是绝对正确的选择:http://msdn.microsoft.com/zh-cn/library/haa3afyz(v=VS.100).aspx - broke
2个回答

2

建议您考虑使用datareader而不是dataset,并使用sqlcommand进行手动更新。

您还应该考虑通过可能提供的附加条件来限制检索的记录数。


1
那么你的意思是说使用数据集无法获得更好的性能?而且我正在使用足够的条件,因为数据集中的每个5个数据表都不包含超过5行。 - Adeem
当您使用DataReader时,它一次移动一条记录,而在DataAdapter和DataSet的情况下,适配器只获取所有记录并为其创建DataRow对象(以及约束和关系,具体取决于是否为类型化数据集)。这个对象创建需要更多时间,这与您拥有的记录数量成正比。这是Web应用程序还是Windows应用程序?根据您正在处理的内容,我可能能够告诉您采取的确切方法。 - Just Me
1
这是一个Web应用程序,我希望在不改变太多代码的情况下提高性能。但如果不可能的话,我肯定会转向将其更改为数据读取器。您关于DataRow对象等方面是正确的。我们能否设置一些属性或其他内容来忽略数据集中的约束和关系内容? - Adeem
我记得 DataSet 中有一个叫做 ignoreconstraints 的属性。请检查一下并确认一下。我已经使用领域模型很长时间了,所以有点忘记 DataSet 的相关内容了。 - Just Me

1

我曾经使用SQLDataAdapter看到非常类似的延迟行为,它需要很多秒才能返回响应,而在SQL Server Mgmt Studio(在同一客户端机器上)运行完全相同的过程,则可以立即返回响应。

我重建了受影响表的索引,然后从SQLDataAdapter获得的响应是瞬间的。

我从未见过SQLDataReader出现这种延迟行为。我经常使用SQLDataReader并只需执行MyTable.Load(MySQLDataReader)。它似乎比SQLDataAdapter具有更少的开销。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接