Em relação a esta pergunta que eu quero fazer
Comparando duas consultas:
(1)
DELETE dbA.dbo.tableA
FROM dbA.dbo.tableA a WITH(NOLOCK)
JOIN dbB.dbo.tableB b WITH(NOLOCK)
ON
b.colA = a.colA
AND b.colB = a.colB
e
(2)
DELETE FROM dbA.dbo.tableA
WHERE EXISTS
(
SELECT *
FROM dbB.dbo.tableB b WITH(NOLOCK)
where
b.colA = dbA.dbo.tableA .colA
AND b.colB = dbA.dbo.tableA .colB
)
é claro que as consultas fazem um trabalho semelhante, se não considerarmos gravações simultâneas que podem levar a leituras sujas.
MAS eu tenho uma dúvida
eu estava certo com o seguinte comentário?
observe que será colocado um bloqueio compartilhado (atualizável?) @ tableA desde o início da instrução (2), em vez de duas tabelas NOLOCK na junção (1), que colocará o primeiro bloqueio - bloqueio UX somente depois disso será encontrada a primeira linha para deletar
Não.
Pelo menos em meus testes, ambos têm planos de execução idênticos e comportamento de bloqueio idêntico. Ambos colocam um
IX
bloqueiotableA
e um bloqueio de estabilidade de esquemaTableB
imediatamente e, em seguida, seguem o mesmo comportamento ao fazer a verificação de índice clusterizado aoTableA
obterIU
bloqueios na página,U
bloqueios nokey
, então, no caso de uma correspondência, converter o bloqueio de página paraIX
o bloqueio de teclaX
antes de excluir a linha. Este é exatamente o mesmo padrão como se aNOLOCK
dicatableA
fosse totalmente removida, então é inútil neste caso.Meus resultados originais tiveram algumas diferenças entre as duas consultas, pois a versão Join tem uma série de bloqueios de estabilidade de esquema aparentemente adquiridos e liberados imediatamente
TableA
que não apareceram naEXISTS
versão. Isso parece estar relacionado a se a opção "Incluir Plano de Execução Real" está habilitada no SSMS. Hoje, se eu tiver esta opção habilitada, esta série aparece nas informações de bloqueio para ambos, então não sei por que originalmente apareceu apenas em um. Talvez algum problema de tempo.Você pode ver essas informações de bloqueio usando
TF1200
como abaixo (com a opção "Incluir plano de execução real" desativada).Código
ObjectIDs
LockRes
Saída (todas as três consultas)