访问SQL Server 2012数据库的第三方应用程序在执行约20分钟后出现[Microsoft][ODBC SQL Server Driver]Query timeout expired
错误。
这是我在应用程序开始收到错误后在数据库中看到的内容:
上面的查询中未显示SPID 102。它是同一应用程序对同一进程的另一种连接。我能够在下面的截图中捕捉到这方面的一些细节。它是此屏幕截图中最顶行的一个。道歉,在截取屏幕截图时,滚动条已向右移动。
发生这种情况时,
AutoShrink
在此数据库上设置为TRUE
。
看起来像:
稍后开始的第三方应用程序的几个连接正在等待SPID 27 - 这是一个AUTOSHIRNK命令
SPID 27正在等待SPID 102,这是来自同一第三方应用程序的另一个连接
问题:
有没有办法判断自AutoShirnk
以来创建的SPID 27与数据库上TRUE
的连接是否已设置为{{1}}?
如果是这样,为什么它等待SPID 102,为什么其他连接(83,85,86,88和90)等待27?
根据以下链接中的TechNet文章,AutoShrink不应对数据库上的任何活动产生影响
如果数据库的AUTO_SHRINK选项设置为ON,则为数据库 引擎减少了数据库中文件的大小。这项活动 发生在后台,不会影响其中的任何用户活动 数据库。
注意:
目前正在SQL Server 2012 SP1上运行此问题。
当应用程序在SQL Server 2008 SP3上运行数据库时,应用程序中的此过程正常工作。
答案 0 :(得分:1)
AUTO SHRINK以循环方式工作,如果它在任何数据库上看到可用空间,它会解除分配。
虽然它没有像长期阻塞这样的任何影响,但它确实占用了很多资源,包括IO和CPU。它还会通过缓冲池移动大量数据,因此可能会导致热页被推送到磁盘,从而进一步降低速度。如果服务器已经在推动IO子系统的限制,那么运行shrink可能会将其推迟,从而导致磁盘队列长度过长,并可能导致IO超时。
您将在此处获得大量答案和说明 - http://www.sqlskills.com/blogs/paul/auto-shrink-turn-it-off/