“警告:连接顺序已被强制执行,因为使用了本地连接提示”没有连接提示返回

Lau*_*gil 3 sql-server sql-server-2012

我正在运行以下(自制)分析查询,查看当前服务器上运行的查询的等待状态、内存使用情况和其他信息。

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
Run Code Online (Sandbox Code Playgroud)

当我运行它并且当前没有正在运行的查询时,我收到警告消息:警告:由于使用了本地连接提示,连接顺序已被强制执行 如您所见,上面的代码中没有连接提示。这只是在我的上下文中很烦人,但这是一个烦人的 SQL Server 错误,这是已知的事情,还是其他什么?

SQL 版本:Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64) 在 VMWare 上运行。在 SSMS 2016(版本 13.0.16106.4)中运行

Jos*_*ell 10

您可以通过运行以下 T-SQL 来获取该 DMV 的定义:

EXEC sp_helptext 'sys.dm_exec_query_memory_grants'
Run Code Online (Sandbox Code Playgroud)

这表明在底层视图定义中使用了连接提示:

CREATE VIEW sys.dm_exec_query_memory_grants AS  
 SELECT A.session_id, A.request_id, A.scheduler_id, A.dop, A.request_time, A.grant_time,  
 A.requested_memory_kb, A.granted_memory_kb, A.required_memory_kb, A.used_memory_kb, A.max_used_memory_kb,  
 A.query_cost, A.timeout_sec,  
 convert(smallint, A.is_small) as resource_semaphore_id,   
 B.queue_id, B.wait_order, B.is_next_candidate, B.wait_time_ms,  
 A.plan_handle, A.sql_handle,  
 A.group_id, A.pool_id, A.is_small, A.ideal_memory_kb  
 FROM OpenRowset(TABLE DM_EXEC_QE_GRANTSINFO) A   
 LEFT OUTER LOOP JOIN OpenRowset(TABLE DM_EXEC_QE_GRANTWAITERS) B  
 ON A.session_id=B.session_id and A.request_id=B.request_id and A.sql_handle=B.sql_handle and A.plan_handle=B.plan_handle  
Run Code Online (Sandbox Code Playgroud)

具体来说,是“LOOP JOIN”提示触发了连接顺序警告。查看有关加入提示的这些Microsoft 文档

如果为任意两个表指定了连接提示,则查询优化器会自动为查询中的所有连接表强制执行连接顺序...

因此,即使视图只有一个提示来强制执行特定的连接策略(循环),也会自动应用连接顺序提示。