2014-10-16 86 views
0

我正在替换用ASP.NET 1.0编写的遗留Web应用程序。我的计划是在现有的数据库模式之上使用MVC5重建一个新的GUI。作为该过程的一部分,我将整个数据库从SQL-Server 2000迁移到SQL-Server 2014,并在新的数据库服务器上指向相同的Web实例。为什么DataAdapter.Fill()与SQL-Server-2014相比要慢于SQL-Server-2000

尽管对新服务器的查询运行速度要快得多,但数据库升级导致我们的网站变慢。我追溯到“DataAdapter.Fill()”调用的缓慢。连接到SQL-Server 2014时,来自Web应用程序的调用需要大约10秒钟,而不是使用旧数据库服务器3秒钟(约慢3倍)。底层存储是非常快的,所以这不是瓶颈。

新的数据库服务器位于相同的网络上,所以延迟不应该成为问题。 Web服务器可以在不到10毫秒的时间内对旧服务器和数据库服务器进行ping操作。

任何想法为什么数据库升级会导致如此戏剧性的放缓?

+0

是否有可能您的索引需要重建? – Capellan 2014-10-16 19:31:55

+0

索引不是问题。即使使用“SET ARITHABORT OFF”,底层存储也足够快。运行“DBCC DROPCLEANBUFFERS”和“DBCC FREEPROCCACHE”确实加快了sproc,但是sproc并不是瓶颈。 我目前的理论是由于SQL版本之间的不匹配,DataAdapter.Fill()调用较慢。由于我通过.NET 1.0框架进行调用,因此它可能依赖于速度较慢的遗留支持API。我没有任何证据或专业知识,但这就是我在这里发布的原因。 – CowboyBebop 2014-10-17 17:38:19

回答

0

好的,问题解决了。缓慢不是加载DataAdapter,而是在对数据库的普通调用中。从ADO.NET调用数据库时,默认关闭ARITHABORT,即使默认情况下SSMS已将其打开。这很难赶上,因为即使当我试图通过调用“SET ARITHABORT OFF”来禁用SSMS中的默认ARITHABORT设置时,它也没有效果(不知道为什么)。

我解决了这个问题,将“SET ARITHABORT ON”添加到我的应用程序调用时运行缓慢的sproc的开头。可以为整个数据库启用此功能,但有一些risks associated with doing that

另外我发现this非常有帮助。

相关问题