我在SQL Server 2012 Express Edition下的生产中遇到了一个跨数据库查询的奇怪问题。我无法在我的开发环境中创建它,所以我认为它与服务器的配置有关,它是使用默认设置作为命名实例安装的。
这不是查询执行性能问题;这是一个数据库连接问题。
采取以下查询(MyTable中有大约100行):
SELECT COUNT(*) FROM MyDatabase..MyTable
执行时间大约为4秒。根据客户端统计信息,客户端处理时间为0,“服务器回复等待时间”构成执行时间的其他四秒。
如果我先执行USE MyDatabase
然后执行我的查询,它就是即时的。如果我按顺序执行它们:
USE MyDatabase
GO
SELECT COUNT(*) FROM MyDatabase..MyTable
由于USE MyDatabase
语句需要很长时间才能执行,因此仍需要延长的时间。表名是否与数据库名完全限定并不重要,也不使用同义词更改内容。在过去我遇到了类似的东西,DBCC CHECKDB(<dbname>)
似乎修复它,但这次我无法让它表现得恰当。 wait_type
中用于连接的sys.dm_exec_requests
是IO_COMPLETION
SPID状态的典型suspended
。我试图修复并重新启动系统,没有运气。这种事情让我觉得它源于身份验证问题,但我不知道如何解决这个问题。
添加了:
我偶尔会收到Database 'MyDatabase' is being recovered. Waiting until recovery is finished
条消息。我也使用SQL Server 2012安装工具执行了完整修复。有任何想法吗?
答案 0 :(得分:1)
看起来原因是数据库的AUTO_CLOSE属性。关闭此ALTER DATABASE MyDatabase SET AUTO_CLOSE OFF WITH NO_WAIT
似乎解决了这个问题。