2013-07-25 3 views
1

Я пытаюсь запросить 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_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, я вижу записи для других баз данных, таких как MSDB и раздачи ион
  • Вот скриншот сопоставлений для моего входа. Я почти уверен, что не должен быть владельцем, но это другой вопрос.

Screenshot of SQL Server permissions showing db_owner role membership

Может кто-нибудь сказать мне, почему мой DMV запрос возвращает нулевое количество строк для этой базы данных?

ответ

1

Цитата Books Online 2008 R2 > sys.dm_exec_sql_text:

DBID SMALLINT ID базы данных. Является NULL для специальных и подготовленных операторов SQL .

1) Таким образом, для данного типа SQL заявления, where db_name(s.dbid) = 'OpenLink' означает where NULL = 'OpenLink' и предикат оценивается в UNKNOWN.

2) dbid колонка NOT NULL для «не АПЧРК и не готовы SQL» высказывания (напр., Для хранимых процедур).

3) Для SQL 2008R2 вы можете получить dbid для "специальных и подготовленных операторов SQL" из sys.dm_exec_plan_attributes (plan_handle) функции (link), используя этот запрос:

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' 
+0

Спасибо за подробное объяснение; ваше решение работает отлично. –