1

我正在尝试查询 SQL Server 2008 R2 中的 DMV。

在这台服务器上有两个名为histrxOpenLink的用户数据库。为了证明我的名字是正确的:

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。

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

显示 db_owner 角色成员身份的 SQL Server 权限屏幕截图

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

4

1 回答 1

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)dbidNOT NULL用于“非即席和非准备 SQL”语句(例如,用于存储过程)。

3) 对于 SQL 2008R2,您可能会使用以下查询从函数(链接dbid)中获取“临时和准备好的 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'
于 2013-07-25T11:17:40.793 回答