【问题标题】:Query timeout until reset SQL Server查询超时直到重置 SQL Server
【发布时间】: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


【解决方案1】:

在我看来,您与数据库的连接是开放的,您可能是“自立门户”。当您恢复数据库时,您需要独占访问权限,因此删除数据库中的人员并回滚正在进行的任何事务(您恢复将导致任何事情发生)。然后你可以恢复你的数据库。

现在重新启动 SQL Server 将关闭所有活动连接,但是有一种更简单的方法 ;-)

使用大师; 去;

ALTER DATABASE [YourDbName]-->将其更改为您的数据库名称

SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

之后,您可以运行恢复。

祝你有美好的一天

沃尔特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2011-08-07
    相关资源
    最近更新 更多