问题描述
我正在使用的系统使用sqlDataReader从整个系统中的数据库中广泛读取数据。但是,在特定情况下,执行代码行需要花费时间
sqlDataReader.GetValues(values);
可能需要2秒,而不是通常少于1毫秒的时间。这个特定的实例从具有两个不同视图的视图中获取数据,其中条件导致两个相同视图类型的不同数据集,但是很多时候相同的数据都在两个数据集中。通常,记录数在50-200之间,并且时间延迟影响六分之一左右,因此对于100条记录而言,这多了30秒。更奇怪的是,即使在相同的数据下,以一种方式获取数据集也没有延迟,而以另一种方式获取数据集也有特定记录的延迟。
换句话说:
DatasetA
RecordId,ColumnA
1,AAA
2,BBB
3,CCC
DatasetB
RecordId,AAA
3,CCC
5,EEE
6,FFF
数据集A的加载时间少于5毫秒,但是数据集B的加载时间为3秒,这是因为读取数据集A的3,CCC
到GetValues
所花费的时间少于1毫秒。读取数据集B时,GetValues
需花费2.7秒以获取完全相同的数据。
这似乎只发生在Azure上,而不发生在我的裸机测试服务器或开发计算机上。
如果在Azure上的sql Server实例和Azure上的Web应用程序之间存在某种程度的延迟,那么我希望这种行为是随机的并且不一致。有没有人看到过这样的东西,或者对如何处理有想法?我很茫然。
谢谢!
解决方法
忍耐是一种美德。
当我在SSMS中运行查询时,我没有等待足够长的时间来完成整个查询。我会得到结果,结果在2秒内填满了我的屏幕,但我从未意识到它实际上是在获取更多记录。因此,我以为要花2秒,实际上花了30秒。我也没有意识到SqlDataReader会在有数据可用时立即开始返回数据,而不一定是在查询完成时才开始返回数据。这就是为什么在GetValues上它将等待直到从服务器返回更多数据的原因。
所以最终问题不在于GetValues,而是查询本身,这很慢。