sys.dm_clr_appdomains (Transact-SQL)
Область применения: SQL Server
Возвращает строку на каждый домен приложения на сервере. Домен приложения (AppDomain) — это конструкция в среде clR ( среда CLR) Microsoft платформа .NET Framework, которая является единицей изоляции для приложения. Это представление можно использовать для понимания и устранения неполадок объектов интеграции СРЕДЫ CLR, выполняемых в Microsoft SQL Server.
Существует несколько типов управляемых объектов CLR для баз данных. Общие сведения об этих объектах см. в разделе "Создание объектов базы данных с интеграцией среды CLR". При выполнении этих объектов SQL Server создает домен приложения, в котором он может загружать и выполнять обязательный код. Уровень изоляции для домена приложения — это один домен приложения для каждой базы данных на владельца. То есть все объекты CLR, принадлежащие пользователю, всегда выполняются в одном домене приложения для каждой базы данных (если пользователь регистрирует объекты базы данных CLR в разных базах данных, объекты базы данных CLR будут выполняться в разных доменах приложений). Домен приложения не уничтожается после завершения выполнения кода. Вместо этого он кэширован в памяти для будущих выполнений. Это повышает производительность.
Дополнительные сведения см. в разделе "Домены приложений".
Имя столбца | Тип данных | Description |
---|---|---|
appdomain_address | varbinary(8) | Адрес домена приложения. Все объекты управляемой базы данных, принадлежащие пользователю, всегда загружаются в один и тот же домен приложения. Этот столбец можно использовать для поиска всех сборок, загруженных в данный момент в этом домене приложений в sys.dm_clr_loaded_assemblies. |
appdomain_id | int | Идентификатор домена приложения. Каждый домен приложения имеет уникальный идентификатор. |
appdomain_name | varchar(386) | Имя домена приложения, назначенное SQL Server. |
creation_time | datetime | Время создания домена приложения. Так как домены приложений кэшируются и повторно используются для повышения производительности, creation_time не обязательно время выполнения кода. |
db_id | int | Идентификатор базы данных, в которой был создан этот домен приложения. Код, хранящийся в двух разных базах данных, не может совместно использовать один домен приложения. |
user_id | int | Идентификатор пользователя, объекты которого могут выполняться в этом домене приложения. |
state | nvarchar(128) | Дескриптор текущего состояния домена приложения. Домен приложения может быть в различных состояниях — от создания до удаления. Дополнительные сведения см. в разделе "Примечания" этой статьи. |
strong_refcount | int | Количество надежных ссылок на этот домен приложения. Это отражает количество выполняемых в настоящее время пакетов, использующих этот домен приложения. Выполнение этого представления приведет к созданию строгой ссылки, даже если в данный момент не выполняется код, strong_refcount будет иметь значение 1. |
weak_refcount | int | Количество слабых ссылок на этот домен приложения. Это указывает, сколько объектов внутри AppDomain кэшируются. При выполнении объекта управляемой базы данных SQL Server кэширует его в домене приложения для дальнейшего повторного использования. Это повышает производительность. |
cost | int | Стоимость доменов приложений. Чем выше стоимость, тем более вероятно, что этот домен приложения выгрузится под давлением памяти. Затраты обычно зависят от объема памяти, необходимого для повторного создания этого домена приложения. |
значение | int | Значение домена приложения. Чем ниже значение, тем более вероятно, что этот домен приложения выгрузится под давлением памяти. Значение обычно зависит от количества подключений или пакетов, использующих этот домен приложения. |
total_processor_time_ms | bigint | Суммарное время процессора в миллисекундах, использованное всеми потоками при выполнении в текущем домене приложения с момента запуска процесса. Это эквивалентно System.AppDomain.MonitoringTotalProcessorTime. |
total_allocated_memory_kb | bigint | Общий размер (в килобайтах) всей выделенной памяти, которая была выделена в домене приложения с момента его создания (без вычета освобожденной и собранной памяти). Это эквивалентно System.AppDomain.MonitoringTotalAllocatedMemorySize. |
survived_memory_kb | bigint | Количество килобайт, сохранившихся после последней полной, блокирующей сборки мусора, на которые заведомо существуют ссылки из текущего домена приложения. Это эквивалентно System.AppDomain.MonitoringSurvivedMemorySize. |
Замечания
Существует связь "один ко многим" между dm_clr_appdomains.appdomain_address и dm_clr_loaded_assemblies.appdomain_address.
В следующих таблицах перечислены возможные значения состояния , их описания и когда они происходят в жизненном цикле appDomain . Эти сведения можно использовать для отслеживания жизненного цикла приложенияDomain и отслеживания подозрительных или повторяющихся экземпляров AppDomain без анализа журнала событий Windows.
Инициализация домена приложений
State | Description |
---|---|
E_APPDOMAIN_CREATING | Создается домен приложений. |
Использование домена приложений
State | Description |
---|---|
E_APPDOMAIN_SHARED | Приложение AppDomain среды выполнения готово для использования несколькими пользователями. |
E_APPDOMAIN_SINGLEUSER | Домен приложения готов к использованию в операциях DDL. Это отличается от E_APPDOMAIN_SHARED, в котором используется общий домен приложения для выполнения интеграции CLR в качестве противопоставления операциям DDL. Такие домены приложения изолированы от остальных текущих операций. |
E_APPDOMAIN_DOOMED | Приложение AppDomain планируется выгрузить, но в настоящее время в нем выполняются потоки. |
Очистка домена приложений
State | Description |
---|---|
E_APPDOMAIN_UNLOADING | SQL Server запросил, чтобы среда CLR выгрузила домен приложения, как правило, так как сборка, содержащая объекты управляемой базы данных, была изменена или удалена. |
E_APPDOMAIN_UNLOADED | Среда CLR выгрузила домен приложения. Обычно это результат процедуры эскалации из-за ThreadAbort, OutOfMemory или необработанного исключения в пользовательском коде. |
E_APPDOMAIN_ENQUEUE_DESTROY | AppDomain был выгружен в среде CLR и установлен для уничтожения SQL Server. |
E_APPDOMAIN_DESTROY | Домен приложения находится в процессе уничтожения SQL Server. |
E_APPDOMAIN_ZOMBIE | Домен приложений был уничтожен SQL Server. Однако не все ссылки на домен приложения были удалены. |
Разрешения
Требует разрешения VIEW SERVER STATE на базу данных.
Разрешения для SQL Server 2022 и более поздних версий
Требуется разрешение VIEW SERVER PERFORMANCE STATE на сервере.
Примеры
В следующем примере показано, как просмотреть сведения о домене приложения для данной сборки:
select appdomain_id, creation_time, db_id, user_id, state
from sys.dm_clr_appdomains a
where appdomain_address =
(select appdomain_address
from sys.dm_clr_loaded_assemblies
where assembly_id = 500);
В следующем примере показано, как просмотреть все сборки в заданном домене приложения:
select a.name, a.assembly_id, a.permission_set_desc, a.is_visible, a.create_date, l.load_time
from sys.dm_clr_loaded_assemblies as l
inner join sys.assemblies as a
on l.assembly_id = a.assembly_id
where l.appdomain_address =
(select appdomain_address
from sys.dm_clr_appdomains
where appdomain_id = 15);
См. также
sys.dm_clr_loaded_assemblies (Transact-SQL)
Связанные динамические административные представления среды cl language (Transact-SQL)