Em um SQL Server 2016 SP2 com memória máxima definida como 25 GB, temos uma consulta que é executada cerca de 80 vezes em um minuto. A consulta derrama cerca de 4.000 páginas para tempdb. Isso causa muito IO no disco do tempdb.
Ao examinar o plano de consulta (consulta simplificada), você verá que o número de linhas estimadas é igual ao número de linhas reais, mas ainda ocorrem derramamentos. Portanto, estatísticas desatualizadas não podem ser a causa do problema.
Fiz alguns testes e os seguintes vazamentos de consulta para o Tempdb:
select id --uniqueidentifier
from SortProblem
where [status] ='A'
order by SequenceNumber asc
option (maxdop 1)
Mas se eu selecionar uma coluna diferente, não ocorrerão derramamentos:
select startdate --datetime
from SortProblem
where [status] ='A'
order by SequenceNumber asc
option (maxdop 1)
Então eu tentei 'ampliar' o tamanho da coluna id:
select CONVERT(nvarchar(512),id)
from SortProblem
where [status] ='A'
order by SequenceNumber asc
option (maxdop 1)
Então também não ocorre nenhum derramamento.
Por que o uniqueidentifier está se espalhando para tempdb e uma coluna de datatime não? Quando excluo cerca de 20.000 registros, também não ocorre derramamento quando seleciono a coluna id.
Com o seguinte script, você pode reproduzir o problema:
CREATE TABLE SortProblem
(
id UNIQUEIDENTIFIER,
startdate DATETIME,
sequencenumber BIGINT,
status VARCHAR(50),
PRIMARY KEY CLUSTERED(id)
)
SET nocount ON;
WITH nums(num)
AS (SELECT TOP 103000 ROW_NUMBER()
OVER (
ORDER BY 1/0)
FROM sys.all_objects o1,
sys.all_objects o2)
INSERT INTO SortProblem
SELECT newid(),
DATEADD(millisecond, num, GETDATE()),
num,
CASE
WHEN num <= 100000 THEN 'A'
WHEN num <= 101000 THEN 'B'
WHEN num <= 102000 THEN 'C'
WHEN num <= 103000 THEN 'D'
END
FROM nums
CREATE NONCLUSTERED INDEX [IX_Status]
ON [dbo].[SortProblem]([status] ASC)
INCLUDE ([sequencenumber])
Habilite o sinalizador de rastreamento 7470.
CORREÇÃO: o operador de classificação transborda para tempdb no SQL Server 2012 ou SQL Server 2014 quando o número estimado de linhas e o tamanho da linha estão corretos
Como escrevi em resposta à pergunta do plano de consulta :