A aparência de um conjunto de resultados ordenados, sem uma ORDER BY
cláusula, geralmente resulta de uma varredura que recupera linhas na ordem do índice. Uma razão pela qual uma varredura por ordem de índice geralmente é escolhida no READ COMMITTED
nível de isolamento padrão é que reduz as chances de anomalias de simultaneidade indesejadas, como encontrar a mesma linha várias vezes ou ignorar algumas linhas por completo. Isso é detalhado em vários lugares, incluindo nesta série de artigos sobre níveis de isolamento.
Com uma NOLOCK
dica de tabela, esse comportamento é relaxado e o acesso à tabela é realizado no READ UNCOMMITTED
nível de isolamento mais tolerante , que pode verificar os dados na ordem de alocação, em vez da ordem do índice. Conforme descrito nesse link, a decisão sobre o uso de uma varredura de ordem de alocação ou ordem de índice é deixada para o mecanismo de armazenamento. Essa opção pode mudar entre execuções sem uma alteração no plano de consulta .
Isso pode parecer muito abstrato, mas pode ser demonstrado com mais facilidade com algumas consultas usando funções não documentadas no banco de dados AdventureWorks2012 .
USE AdventureWorks2012;
GO
-- Appears to be ordered by BusinessEntityID
-- File:Page:Slot goes up and down several times
-- Show physical locations with sys.fn_PhysLocFormatter (undocumented)
SELECT
P.BusinessEntityID,
[(File:Page:Slot)] =
sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P;
-- Same query with TABLOCK or NOLOCK
-- Allocation-order (IAM) scan
-- Now appears to be ordered by File:Page:Slot instead of BusinessEntityID
SELECT P.BusinessEntityID,
[(File:Page:Slot)] =
sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P WITH (NOLOCK);
As consultas são emprestadas com uma leve modificação de Paul White .
Finalmente, só para esclarecer, esta resposta é sobre a aparência de um conjunto de resultados ordenados. Não há ordem de apresentação garantida sem um nível superior ORDER BY
.
Uma varredura da ordem de alocação pode ocorrer em várias outras circunstâncias, como quando um bloqueio no nível da tabela é adquirido ou o banco de dados está no modo somente leitura. O paralelismo também pode influenciar a ordem em que os dados são retornados. O ponto principal é que ORDER BY
, sem eles , os dados de ordem retornados podem variar ao longo do tempo por design.