我正在尝试查询SQL Server 2008 R2中的DMV。
在此服务器上有两个名为 histrx 和 OpenLink 的用户数据库。为了证明我的名字是正确的:
select db_id('histrx') -- Returns 5
select db_id('OpenLink') -- Returns 7
如果我运行以下查询,选择 histrx 数据库的条目,我会在结果集中得到25行:
select top 25
total_worker_time/execution_count as avg_worker_time,
total_logical_reads/execution_count as avg_logical_reads,
db_name(s.dbid) as [db_name],
object_name(s.objectid, s.dbid) as [object_name],
execution_count,
plan_generation_num,
last_execution_time,
creation_time,
[text],
p.query_plan
from
sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.plan_handle) s
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) p
where
db_name(s.dbid) = 'histrx'
order by
avg_logical_reads desc
如果我然后将where
子句更改为以下内容,则不返回任何行:
where
db_name(s.dbid) = 'OpenLink'
我知道 OpenLink 数据库上有大量活动。如果我在活动监视器中查看最近的昂贵查询,我可以看到 OpenLink 的条目,我很确定这是使用下面的DMV。
select * from fn_my_permissions (NULL, 'server');
,那么我可以看到我有查看服务器状态权限where
子句,我会看到其他数据库的条目,例如 msdb 和 distribution
有谁能告诉我为什么我的DMV查询为这个数据库返回零行?
答案 0 :(得分:1)
引自Books Online 2008 R2 > sys.dm_exec_sql_text:
dbid smallint数据库的ID。对于临时和准备好的SQL,它是NULL 语句。
1)因此,对于这种类型的SQL语句,where db_name(s.dbid) = 'OpenLink'
表示where NULL = 'OpenLink'
,并且此谓词的计算结果为UNKNOWN
。
2)dbid
列为“非特殊和未准备好的SQL”语句NOT NULL
。(例如存储过程)。
3)对于SQL 2008R2,您可以使用此查询从dbid
函数(link)获取“临时和准备好的SQL语句”sys.dm_exec_plan_attributes ( plan_handle )
:
SELECT
...
ISNULL(src.dbid,CONVERT(SMALLINT,att.value)) AS my_dbid,
DB_NAME(ISNULL(src.dbid,CONVERT(SMALLINT,att.value))) my_dbname,
...
FROM
sys.dm_exec_query_stats qs
...
CROSS APPLY sys.dm_exec_plan_attributes(qs.plan_handle) att
WHERE att.attribute='dbid'