Há um índice em cluster em um Client
campo da tabela LastName
.
Quando simplesmente despejo todos os registros da tabela, eles aparecem em ordem alfabética, a menos que (nolock)
seja usada uma dica como na consulta em questão. Essa dica altera a ordem dos registros. Deveria?. Tenho certeza de que nenhuma outra sessão tem uma transação aberta com as alterações nessa tabela (pelo menos sp_who2
não está me mostrando nenhuma).
Como a diferença na ordem pode ser explicada?
Informações adicionais extraídas dos comentários:
Não há ordem por. O índice não agrupado deve impor a ordem?
As consultas ainda retornam ordem diferente, mesmo ao usar uma dica de índice que especifica um índice em cluster. Eles deveriam? Estou me perguntando por que
nolock
altera a ordem dos registros retornados sem uma alteração visível dos planos.Eu fiz um WinDiff neles - o mesmo, exceto [a]
(nolock)
[dica de consulta].
Respostas:
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 noREAD 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 noREAD 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 .
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.fonte
... então você não deve esperar nenhum pedido. De fato, a mesma consulta executada várias vezes pode voltar em uma ordem diferente sem aviso. O motivo é que suas duas consultas - que são "diferentes", provavelmente por causa do texto da consulta, não por causa da dica - têm planos de execução diferentes (e a diferença pode ser sutil, como um iterador com a mesma aparência em ambos os planos, mas possui
ordered: true
apenas um ou um número muito diferente de linhas estimadas porque uma foi compilada antes de uma grande alteração de dados). Também pode ser que uma verificação de ordem de alocação esteja sendo realizada, como James descreveu corretamente em sua resposta.De qualquer forma, como você está executando uma consulta sem
ORDER BY
, o SQL Server deduz que você não se importa com a ordem e, portanto, dispara e determina a maneira mais eficiente de retornar as linhas (não se importa com a ordem, se você não )Deixe-me deixar isso bem claro:
Se você deseja ou espera um determinado pedido, adicione uma cláusula ORDER BY
Isso já ocorreu antes:
E eu escrevi sobre isso:
Aqui está uma citação deste último que reitera o que eu disse para abordar seu comentário sobre o uso de uma dica de índice em vez de uma
ORDER BY
cláusula:Conor Cunningham - um cara muito inteligente, diretamente responsável por muito do que o SQL Server faz quando processa uma consulta para você - também publicou um blog sobre isso aqui:
Faça algumas leituras e adicione uma
ORDER BY
cláusula às suas perguntas antes de reclamar sobre uma classificação diferente ou inesperada.fonte
James explicou bem como isso funciona, mas eu gostaria de reiterar uma coisa: a menos que você use uma função de ordenação, a ordem das linhas no conjunto de resultados é indefinida . Se você precisar de uma determinada ordem, use uma
order by
cláusula explícita - se você não a especificar, estará basicamente dizendo "Não me importo com a ordem", e não "Ordená-la pelo índice de cluster".fonte