【发布时间】:2014-01-29 14:50:08
【问题描述】:
重现步骤(SQL Server 2008R2):
- 我们恢复一个 .bak 文件
- 我们运行查询(没有其他活动)
- 超时
- 我们重启sql server
- 我们运行查询
- 运行速度非常快。
繁殖率 100%。
我试过组合
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
DBCC FREESESSIONCACHE
DBCC FREESYSTEMCACHE ('ALL')
DBCC UPDATEUSAGE (dbname)
EXEC sp_updatestats
select * from master..sysprocesses where blocked <> 0
没有任何效果,只能重新启动 SQL Server。
我认为这只是一个糟糕的计划,但预计 FREEPROCCACHE 会修复它,而无需重新启动 SQL Server。我还需要清除其他缓存吗?
查询不是事务/阻塞/锁定样式,主要是从它创建的临时表中选择进出,服务器上没有其他活动。
我认为这一定是一个糟糕的计划,但DBCC FREEPROCCACHE 没有完成这项工作。
有人知道吗?
【问题讨论】:
-
你试过贴
OPTION (RECOMPILE)吗? -
主要问题是此 SQL 是动态生成的(即席),它不是存储过程。用户可以通过勾选 UI 中的框来更改查询。所以我们不知道什么时候应该重新编译。也许我们可以检测到超时,然后强制重新编译(仅一次)。我会试试看这是否有腿。谢谢。我忘了提一件事,重新启动必须在查询执行时发生,或者在它超时之后,而不是之前。
-
查询是每次超时还是仅在选择 UI 上的特定项目时超时?您说用户可以选择他们想要的任何项目,这是否意味着只有在选择特定项目时才会成为问题?
-
如果您捕获 SQL 语句并在 SQL 管理工作室中运行它,您是否有同样的问题?您提到没有其他活动,您的意思是,除了用于生成查询的 UI 之外,或者您检查了活动监视器并确保没有其他活动在运行?
-
@SaUce 是的,我们有自己的“查询设计器 UI”,当我们生成使用 CTE 填充临时 (#) 表的 SQL 时,它似乎只会选择错误的计划。如果我们更改设计器以使查询稍有不同或使用永久工作表,那么问题就消失了。如果我们重置服务器(如前所述),它也会消失。
标签: sql-server sql-server-2008-r2