sys.dm_exec_query_memory_grants (Transact-SQL)
返回已经获得内存授予的查询的有关信息,或仍需执行内存授予的查询的有关信息。 无需等待内存授予的查询将不会出现在此视图中。
在 Windows Azure SQL Database 中,动态管理视图不能公开将影响数据库包含的信息,也不能公开有关用户可以访问的其他数据库的信息。 要避免公开此类信息,需要将包含不属于已连接租户的数据的每一行都筛选掉。 此外,还将筛选以下列中的值:scheduler_id、wait_order、 pool_id、group_id;列值设置为 NULL。
适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。 |
列名 |
数据类型 |
说明 |
---|---|---|
session_id |
smallint |
正在运行查询的会话 ID (SPID)。 |
request_id |
int |
请求的 ID。 在会话的上下文中是唯一的。 |
scheduler_id |
int |
正在计划查询的计划程序的 ID。 |
dop |
smallint |
查询的并行度。 |
request_time |
datetime |
查询请求内存授予的日期和时间。 |
grant_time |
datetime |
向查询授予内存的日期和时间。 如果尚未授予内存,则此值为 NULL。 |
requested_memory_kb |
bigint |
请求的内存总量 (KB)。 |
granted_memory_kb |
bigint |
实际授予的内存总量 (KB)。 如果尚未授予内存,该值可以为 NULL。 在典型情况下,该值应与 requested_memory_kb 相同。 创建索引时,除了初始授予的内存外,服务器还允许增加按需分配的内存。 |
required_memory_kb |
bigint |
运行查询所需的最小内存 (KB)。 requested_memory_kb 等于或大于该值。 |
used_memory_kb |
bigint |
此刻使用的物理内存 (KB)。 |
max_used_memory_kb |
bigint |
到此刻为止所用的最大物理内存 (KB)。 |
query_cost |
float |
估计查询开销。 |
timeout_sec |
int |
查询放弃内存授予请求前的超时时间(秒)。 |
resource_semaphore_id |
smallint |
此查询正在等待的资源信号量的非唯一 ID。 备注 此 ID 在早于 SQL Server 2008的 SQL Server 版本中是唯一的。此更改会对故障排除查询执行造成影响。有关详细信息,请参阅本主题后面的“备注”部分。 |
queue_id |
smallint |
查询等待内存授予时所在等待队列的 ID。 如果已授予内存,则为 NULL。 |
wait_order |
int |
等待查询在指定的 queue_id 中的顺序。 如果其他查询获得内存授予或超时,则给定查询的该值可以更改。 如果已授予内存,则为 NULL。 |
is_next_candidate |
bit |
下一个内存授予的候选对象。 1 = 是 0 = 否 NULL = 已授予内存。 |
wait_time_ms |
bigint |
等待时间(毫秒)。 如果已授予内存,则为 NULL。 |
plan_handle |
varbinary(64) |
查询计划的标识符。 使用 sys.dm_exec_query_plan 可提取实际的 XML 计划。 |
sql_handle |
varbinary(64) |
查询的 Transact-SQL 文本标识符。 使用 sys.dm_exec_sql_text 可获取实际的 Transact-SQL 文本。 |
group_id |
int |
在其中运行此查询的工作负荷组的 ID。 |
pool_id |
int |
该工作负荷组所属的资源池的 ID。 |
is_small |
tinyint |
如果设置为 1,则指示此授予使用小型资源信号量。 如果设置为 0,则指示使用常规信号量。 |
ideal_memory_kb |
bigint |
将所有内容存放在物理内存中所需的内存授予的大小(以 KB 为单位)。 这基于基数估计。 |
权限
要求对服务器拥有 VIEW SERVER STATE 权限。
注释
查询超时的典型调试情况可能如下所示:
使用 sys.dm_os_memory_clerks、sys.dm_os_sys_info 和各种性能计数器检查总体系统内存状态。
检查 sys.dm_os_memory_clerks(其中 type = 'MEMORYCLERK_SQLQERESERVATIONS')中的查询执行内存预留。
使用 sys.dm_exec_query_memory_grants 检查等待授予的查询。
使用 sys.dm_exec_requests 进一步检查要占用大量内存的查询。
如果怀疑有失控查询,请检查来自 sys.dm_exec_query_plan 的显示计划和来自 sys.dm_exec_sql_text 的批处理文本。
如果查询使用的动态管理视图中包括 ORDER BY 或聚合,则可能会增加内存占用,进而产生需进行故障排除的问题。
数据库管理员可以使用资源调控器功能在多个资源池之间分发服务器资源,最多可为 64 个池。 从 SQL Server 2008 开始,每个池都类似于一个小型的独立服务器实例并且要求 2 个信号量。从 sys.dm_exec_query_resource_semaphores 中返回的行数可比 SQL Server 2005 中返回的行数多 20 倍。