Sql server 为什么这些DMV返回除一个数据库之外的所有数据库的行?

Sql server 为什么这些DMV返回除一个数据库之外的所有数据库的行?,sql-server,sql-server-2008-r2,database-permissions,dmv,Sql Server,Sql Server 2008 R2,Database Permissions,Dmv,我正在尝试查询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_w

我正在尝试查询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数据库上有大量的活动。如果我在Activity Monitor中查看最近昂贵的查询,我可以看到OpenLink的条目,我很确定这是在使用下面的DMV

  • 我在同一个目录下运行活动监视器和DMV查询 登录
  • 该登录名是OpenLink数据库的所有者
  • 如果我运行
    select*from fn_my_permissions(NULL,'server')然后我可以看到我有查看服务器状态权限
  • 如果删除
    where
    子句,我会看到其他数据库的条目,如msdb和distribution
  • 这是我的登录映射的屏幕截图。我很确定我不应该是老板,但那是另一个问题

有人能告诉我为什么我的DMV查询返回此数据库的零行吗?

引用自:

数据库的dbid smallint ID。对于临时和准备好的SQL,为空 声明

1) 因此,对于这种类型的SQL语句,
其中db_name(s.dbid)='OpenLink'
表示
其中NULL='OpenLink'
,该谓词的计算结果为
未知

2)
dbid
列是
notnull
用于“非临时和非准备SQL”语句(例如,用于存储过程)

3) 对于SQL 2008R2,您可以使用以下查询从sys.dm_exec_plan_attributes(plan_handle)
函数()获取“临时和准备好的SQL语句”的
dbid

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'
引自:

数据库的dbid smallint ID。对于临时和准备好的SQL,为空 声明

1) 因此,对于这种类型的SQL语句,
其中db_name(s.dbid)='OpenLink'
表示
其中NULL='OpenLink'
,该谓词的计算结果为
未知

2)
dbid
列是
notnull
用于“非临时和非准备SQL”语句(例如,用于存储过程)

3) 对于SQL 2008R2,您可以使用以下查询从sys.dm_exec_plan_attributes(plan_handle)
函数()获取“临时和准备好的SQL语句”的
dbid

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'

感谢您的详细解释;您的解决方案非常有效。感谢您的详细解释;您的解决方案非常有效。