Estou executando a consulta de análise (caseira) abaixo, observando os estados de espera, o uso de memória e outras informações para consultas em execução no servidor atual.
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
Quando executo isso e não há consultas em execução no momento, recebo a mensagem de aviso: Aviso: A ordem de junção foi aplicada porque uma dica de junção local é usada Como você pode ver, não há dicas de junção no código acima. Isso só é irritante no meu contexto, mas é um bug irritante do SQL Server, isso é uma coisa conhecida ou é outra coisa?
Versão do SQL: Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64) em execução no VMWare. Executando no SSMS 2016 (versão 13.0.16106.4)
Você pode obter a definição desse DMV executando o seguinte T-SQL:
O que mostra que uma dica de junção está sendo usada na definição de exibição subjacente:
Especificamente, é a dica "LOOP JOIN" que está acionando o aviso de ordem de junção. Confira estes documentos da Microsoft sobre dicas de ingresso:
Portanto, mesmo que a exibição tenha apenas uma dica para impor uma estratégia de junção específica (loop), uma dica de ordem de junção é aplicada automaticamente.