由于数据库镜像的缓存对象,检索缓存计划失败

6 sql-server mirroring sql-server-2008-r2

我正在尝试检索特定数据库对象的缓存执行计划,但由于缓存计划属于处于 MIRROR 状态的镜像数据库,因此失败。

下面的查询,没有任何额外的 WHERE 子句失败,并出现以下 SQL 错误:

消息 954,级别 14,状态 1,第 1 行 无法打开数据库“DatabaseName”。它充当镜像数据库。

SELECT  *
FROM    sys.dm_exec_query_stats AS deqs 
CROSS APPLY     sys.dm_exec_query_plan(deqs.plan_handle) AS deqp
Run Code Online (Sandbox Code Playgroud)

我怀疑 sys.dm_exec_query_plan 函数首先尝试解析缓存中的所有计划句柄,但在镜像数据库的缓存对象上失败。

有谁知道是否有任何方法可以解决这个问题,T-SQL 明智的?

当然,我可以执行 DBCC FREEPROCCACHE 来清除缓存,但是我希望有其他解决方案。我有点惊讶这个函数在尝试解析计划时没有丢弃镜像数据库中的任何对象。

SQL*_*tar 4

sys.dm_exec_query_plan 有一个为 dbid 返回的列,您可以仅针对正在镜像的数据库筛选该列。

或者,您可以奇特地嵌套一个子查询,通过转到 sys.database_mirroring DMV 来过滤任何处于镜像状态的 dbid。