À medida que o número de núcleos de CPU nos servidores continua aumentando, o aumento associado na simultaneidade pode trazer contenção em estruturas de dados que precisam ser acessadas de maneira serial no engine do banco de dados.
Isso vale para cargas de trabalho OLTP com alta taxa de transferência/alta simultaneidade.
Este artigo abordará um tipo específico de contenção em estruturas de dados que usam spinlocks para serializar o acesso a essas estruturas de dados.
Latch Contention
Latch Contentio é uma espécie de bloqueio leve usado pela engine do SQL Server para garantir a consistência das estruturas na memória, incluindo índices, páginas de dados e estruturas internas (como páginas não-folha em uma B-Tree). O SQL Server usa Buffer Latches para proteger páginas no Buffer Pool e I/O Latches para proteger páginas ainda não carregadas no Buffer Pool. Sempre que dados são gravados ou lidos de uma página no Buffer Pool, uma worker thread adquire uma Buffer Latch para a página em primeiro lugar. Vários tipos de Buffer Latches estão disponíveis para acessar páginas no Buffer Pool, incluindo a Exclusive Latch (PAGELATCH_EX) e a Shared Latch (PAGELATCH_SH). Quando o SQL Server tenta acessar uma página que ainda não está presente no Buffer Pool, um chamada I/O assíncrona carrega a página no Buffer Pool. Se o SQL Server precisar esperar que o subsistema de I/O responda, ele aguardará uma uma I/O Exclusive Latch (PAGEIOLATCH_EX) ou Shared Latch (PAGEIOLATCH_SH), dependendo do tipo de solicitação. Isso é feito para impedir que outra Worked Thread carregue a mesma página no Buffer Pool com um Latch incompatível. Latches também são usados para proteger o acesso a estruturas de memória internas que não sejam as páginas do Buffer Pools.
A contenção em Page Latches é o cenário mais comum encontrado em sistemas com várias CPUs.
Uma Latch Contention ocorre quando várias threads tentam adquirir simultaneamente travas incompatíveis na mesma estrutura na memória. Como um Latch é um mecanismo de controle interno, o mecanismo do banco de dados SQL determina automaticamente quando usá-las. Uma vez que o comportamento das travas é determinístico, as decisões do aplicativo, incluindo o design de esquema, podem afetar esse comportamento.

Existem diversas técnicas para resolver o problema de Latch Contention. O método mais utilizado é o Hash partitioning com uma coluna computada.
No segundo artigo dessa série, demonstraremos como diagnosticar e resolver o problema de Latch Contention.