Estou coçando a cabeça, relendo a ajuda da MSFT e ainda não consigo entender a diferença entre forwarded_fetch_count e forwarded_record_count em sys.dm_db_index_operative_stats e sys.dm_db_index_physical_stats. Deixe-me ilustrar meu problema de compreensão dos pontos de vista com o exemplo abaixo.
Eu executei as seguintes consultas:
;with heaps as (
select
DB_NAME(DB_ID()) dbname, object_name ( p.object_id ) objname, sum(row_count) row_count,
DB_ID() database_id, p.object_id objectid
from
sys.dm_db_partition_stats p
join sys.objects o on o.object_id = p.object_id
WHERE
index_id = 0 and o.is_ms_shipped = 0 --and row_count > 0
group by p.object_id )
select
h.*,
forwarded_fetch_count
from heaps h
cross apply sys.dm_db_index_operational_stats(database_id, objectid, 0, null) ps
WHERE forwarded_fetch_count > 0 ORDER BY forwarded_fetch_count DESC¨
E
SELECT page_count, OBJECT_NAME(ps.object_id)
,avg_record_size_in_bytes
,avg_page_space_used_in_percent
,forwarded_record_count
FROM sys.dm_db_index_physical_stats(db_id('your_db_name'), NULL,NULL, NULL, 'DETAILED') AS ps
WHERE forwarded_record_count IS NOT NULL AND forwarded_record_count > 0
GO
Ambas as consultas retornaram listas diferentes de tabelas em um único banco de dados que estou ajustando. A primeira consulta retornou tabelas variando de 1.000 a 100.000 buscas encaminhadas por tabela, a segunda consulta retornou qualquer coisa entre 10 e 60.000 contagens de registros encaminhados para outro conjunto de tabelas.
Para consertar a fita adesiva, reconstruí as tabelas em questão. No entanto, no monitor de desempenho do Windows, ainda vejo muitos registros encaminhados/s (o gráfico geralmente chega a 100). Ao executar sp_blitzfirst @seconds = 30, sou alertado sobre muitas buscas encaminhadas/s. Uma vez que o alerta é geral (ou seja, não relacionado a nenhum banco de dados), outros 9 alertas da mesma instrução mencionam: "Forwarded Fetches/Sec High: TempDB Object". E de acordo com a contagem de buscas encaminhadas, há dez ou cem vezes mais buscas encaminhadas no TempDB do que fora do TempDB.
Por último, mas não menos importante, o ISV implementou fortemente gatilhos (que relaciono com as buscas encaminhadas do TempDB).
Minhas perguntas:
- Qual é a diferença entre as duas colunas em duas visualizações?
- Ao lidar com banco de dados lento devido a registros encaminhados em um heap, qual devo usar? (Eu sei que a ajuda da MSFT menciona forwarded_record_count em dm_db_index_physical_stats relacionado especificamente a heaps, ainda não deixando isso mais claro para mim).
- Posso identificar o que no TempDB está causando essas buscas encaminhadas?
A visualização de estatísticas físicas retorna informações sobre a estrutura física do índice ou tabela.
A contagem de registros encaminhados mostra quantas linhas no heap encaminharam registros . Eles são criados quando uma linha de heap é atualizada para um tamanho que não cabe mais na página. A linha é movida para uma página diferente com espaço suficiente e um ponteiro de encaminhamento é deixado na linha original.
Para uma tabela heap com 123 registros encaminhados, a contagem de registros encaminhados também será 123.
A visualização de estatísticas operacionais mantém a contagem de operações no heap (ou índice) do ponto de vista do mecanismo de armazenamento.
Uma busca encaminhada ocorre quando um plano de execução precisa de uma linha de heap que foi encaminhada. Ele é incrementado cada vez que um ponteiro de encaminhamento é seguido para localizar os dados necessários à consulta ou instrução.
A varredura completa de uma tabela heap com 123 registros encaminhados adicionaria 123 à contagem de buscas encaminhadas . Executar essa consulta 5 vezes adicionaria 5 x 123 = 615 à contagem.
Uma única consulta (e plano de execução) que varre o heap mais de uma vez também pode adicionar múltiplos de 123 à contagem, ou qualquer outro número, caso o heap seja apenas parcialmente varrido (talvez porque a consulta tenha uma cláusula)
TOP
.A questão é que a contagem de buscas encaminhadas é incrementada sempre que qualquer usuário, qualquer consulta e qualquer operador de plano dentro de um plano de execução precisar de uma linha do heap e descobrir que ela foi encaminhada.
Em outras palavras, as estatísticas operacionais fornecem métricas cumulativas sobre como as consultas acessam os dados. As estatísticas físicas informam sobre o estado físico da pilha em um determinado momento.
Se você estiver interessado no desempenho da consulta, provavelmente prestará atenção às estatísticas operacionais .
Se você estiver interessado no estado das estruturas físicas, verá as estatísticas físicas .
Quando tiver certeza de que os registros encaminhados estão realmente causando um problema real de desempenho, você os corrigirá não usando heaps, reconstruindo heaps ou alterando a estrutura da tabela ou consultas para que menos atualizações resultem no encaminhamento de linhas.