Existe uma tabela que parece ter atualizações constantes. Há também um procedimento armazenado que é executado periodicamente e itera por tabelas e tenta truncar uma partição de dados usando o comando abaixo:
TRUNCATE TABLE [dbo].[Table] WITH (PARTITIONS (10))
O procedimento de loop sempre fica travado na mesma tabela, a tabela com atualizações constantes falha mesmo quando os dados não estão sendo atualizados na partição destinada à exclusão.
O processo de chamada não pode ser atualizado. Existe um truque para vincular as atualizações a uma partição fora da modificação da consulta ou alguma outra maneira de forçar as partições que não mudam a não serem bloqueadas/bloqueadas?
Um bloqueio de página causará falha no truncamento da partição? Por exemplo, duas partições poderiam compartilhar uma única página e tentar excluir com a partição (2) falha porque algum processo está atualizando dados na partição 1 com a qual 2 está compartilhando uma página?
CREATE TABLE [dbo].[Table]
(
[TableID] INT NOT NULL
...
, [SourceID] NVARCHAR(4000) NOT NULL
, CONSTRAINT [PK_Table_TableID] PRIMARY KEY NONCLUSTERED([TableTableID] ASC , [SourceID] ASC) ON psSourceID(SourceID)
, CONSTRAINT [CIX_Table_TableID] UNIQUE CLUSTERED ([SourceID] ASC, [TableID] ASC) ON psSourceID(SourceID)
)
ON psSourceID(SourceID)
GO
ALTER TABLE [dbo].[Table] SET (LOCK_ESCALATION = AUTO)
GO
O TRUNCATE
comando está sendo bloqueado por uma sessão que executa atualizações na tabela. Em ambientes inferiores, um processo de bloqueio nunca foi atingido após muitas tentativas, portanto, presumia-se que WITH PARTITION
só colocaria bloqueios de metadados por partição, não por toda a tabela.
Como Dan Guzman mencionou, um truncado requer acesso exclusivo a toda a tabela. Parece que este é o caso mesmo ao truncar uma partição específica, em vez de apenas exigir acesso exclusivo por partição. A esperança era que as atualizações e inserções pudessem continuar a ser executadas simultaneamente em uma tabela em determinadas partições, enquanto um rápido
TRUNCATE TABLE WITH PATITION
pudesse remover grandes áreas de dados da mesma tabela em uma partição "não ativa".A única solução é fazer um loop em todas as tabelas e tentar determinar se há uma transação de longa duração para cada uma delas. Nas tabelas onde o acesso exclusivo pode ser obtido, o método truncar com partição pode ser utilizado, enquanto aquelas com bloqueios exclusivos precisam ser relatadas para que uma nova tentativa possa ser executada ou, como último recurso, emitem uma instrução delete.
O truncar com partição remove mais de 400 milhões de registros em menos de um segundo, por isso é importante tentar utilizar esse método em vez da exclusão.