Estou trabalhando em um processo para remover 90% dos dados de uma tabela porque apenas 10% são necessários para testes.
A melhor maneira que encontrei inclui armazenar 10% das linhas da tabela em uma tabela temporária.
Método atual
SELECT TOP 10 PERCENT *
INTO #temp_some_table
FROM some_table (nolock)
ORDER BY some_column DESC
TRUNCATE TABLE some_table
INSERT INTO some_table
SELECT *
FROM #temp_some_table
DROP TABLE #temp_some_table
Este método está enchendo o tempdb e fazendo com que o disco também fique cheio.
Perguntas
Existe uma maneira mais eficiente de excluir 90% dos dados de uma tabela ex ( DELETE TOP 90 PERCENT FROM sometable
)
ou
Existe uma maneira de inserir 10% dos dados de some_table em uma tabela temporária usando lotes? Algo assim:
DECLARE @r INT;
WHILE @r > 0
BEGIN
BEGIN TRANSACTION;
INSERT INTO [dbo].[##temp_cds_Basket]
SELECT TOP 10 PERCENT *
FROM [dbo].[cds_basket] s
SET @r = @@ROWCOUNT;
print @r
COMMIT TRANSACTION
END
Solução possível
Que tal agora?
SET NOCOUNT ON;
DECLARE @r INT;
DECLARE @TenPercentDate datetime
with cte (some_column) as (
select top 10 percent some_column from some_table (nolock) order by some_column desc
)
select @TenPercentDate = min(some_column)
from cte
select @TenPercentDate
SET @r = 1;
WHILE @r > 0
BEGIN
BEGIN TRANSACTION;
DELETE TOP (10000) from
some_table
WHERE some_column < @TenPercentDate
SET @r = @@ROWCOUNT;
print @r
COMMIT TRANSACTION;
--CHECKPOINT; -- if simple
END
--rollback
Tenho três ideias diferentes que mencionei em um comentário acima. Aqui está um pouco de elaboração sobre pelo menos um deles (no qual você está preso devido à visão de túnel autodiagnosticada).
Eu estava pensando sobre isso, mas realmente não precisamos fazer a comparação - podemos apenas descobrir qual valor de data e hora está no limite do que queremos manter e excluir pedaços de linhas antigas até que não reste nenhuma. Por exemplo:
Você pode ver esta postagem para algumas maneiras adicionais de aprimorar isso.
Acho que essa seria uma opção válida e deveria causar menos dor do que a anterior.
Este também é menos doloroso, mas sinta-se à vontade para injetar alguma depuração nele para ter certeza de que obteve os dados desejados antes de executar a eliminação.
Observe que em ambos os últimos casos pode haver restrições, exibições vinculadas ao esquema etc. a ser tratado). Também haverá ramificações para os planos existentes (excluir 90% dos dados também deve fazer com que as estatísticas atualizem e invalidem os planos, então realmente não é diferente) e, como @Kenneth aponta abaixo, você precisará restabelecer as permissões no nova tabela (portanto, você pode querer ter certeza de que pode fazer o script com antecedência).
A menos que eu esteja perdendo alguma coisa (e poderia estar!), isso resolve.