我正在运行以下(自制)分析查询,查看在当前服务器上运行的查询的等待状态、内存使用情况和其他信息。
Select GetDate() as RunDate,
spid,
blocked,
waittype,
lastwaittype,
waittime,
sp.dbid,
uid,
status,
hostname,
program_name,
cmd,
nt_domain,
nt_username,
loginame,
sp.sql_handle,
stmt_start,
stmt_end,
session_id,
dop,
request_time,
grant_time,
requested_memory_kb,
granted_memory_kb,
required_memory_kb,
used_memory_kb,
max_used_memory_kb,
query_cost,
ideal_memory_kb
,SUBSTRING (qt.text, stmt_start/2+1, (
CASE
WHEN stmt_end = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 + 1
ELSE stmt_end
END - stmt_start)/2) AS [Individual Query]
,[Parent Query] = qt.text
FROM sys.dm_exec_query_memory_grants mg
INNER JOIN sys.sysprocesses sp
ON mg.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(sp.sql_handle) as qt
WHERE sp.spid != @@SPID
ORDER BY requested_memory_kb
当我运行它并且当前没有正在运行的查询时,我收到警告消息:警告:连接顺序已被强制执行,因为使用了本地连接提示如您所见,上面的代码中没有连接提示。这只是在我的上下文中很烦人,但这是一个烦人的 SQL Server 错误,这是一个已知的事情,还是别的什么?
SQL 版本:Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64) 在 VMWare 上运行。在 SSMS 2016 中运行(版本 13.0.16106.4)
您可以通过运行以下 T-SQL 来获取该 DMV 的定义:
这表明在底层视图定义中使用了连接提示:
具体来说,触发连接顺序警告的是“LOOP JOIN”提示。查看有关加入提示的这些Microsoft 文档:
因此,即使视图只是提示强制执行特定的连接策略(循环),也会自动应用连接顺序提示。