10.1.26

Заблуждения о выполнении DMV для баз данных с меньшими уровнями совместимости

Автор: Paul Randal, Misconceptions about running DMVs on databases with lower compatibility levels

У моего класса перерыв на обед — время для записи в блоге! Это интересный вопрос, который возникает периодически (буквально час назад на SQL Server Central) и не очень широко известен.

Существует заблуждение, что вы не можете выполнять динамические административные представления (DMV) в базах данных с уровнем совместимости 80 или ниже. Это не так.

Вот пример:

USE master;
GO
EXEC sp_dbcmptlevel AdventureWorks, 80;

USE AdventureWorks;
GO

SELECT [object_id], [index_id]
FROM sys.dm_db_index_physical_stats (
    DB_ID ('AdventureWorks'), NULL, NULL, NULL, NULL)
WHERE [avg_fragmentation_in_percent] > 30;
GO
    

Вы получаете невероятно полезное и информативное сообщение:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '('.
    

Что, чёрт возьми, это значит? На самом деле это означает, что обработчик запросов отказался распознать имя DMV, потому что база данных работает с уровнем совместимости 80 или ниже.

Но движок можно обхитрить — выполните DMV в контексте базы данных с уровнем совместимости 90 или выше, и это позволит вам сделать это — даже если вы фактически обращаетесь к базе данных с более низким уровнем совместимости.

USE master;
GO

SELECT [object_id], [index_id]
FROM sys.dm_db_index_physical_stats (
    DB_ID ('AdventureWorks'), NULL, NULL, NULL, NULL)
WHERE [avg_fragmentation_in_percent] > 30;
GO
    
object_id   index_id
---------   ---------
18099105    2
30623152    2
30623152    3
30623152    4
66099276    1
66099276    2
...
    

Обратите внимание, что я выполнил DMV из контекста базы данных master, но указал в качестве цели AdventureWorks, которая имеет уровень совместимости 80.

Комментариев нет:

Отправить комментарий