Azure SQL 大删除

the*_*220 5 sql azure sql-delete azure-sql-database

我目前正在使用 Azure 托管的 SQL 服务器实例处理应用程序。应用程序数据不占用大量物理空间,但有很多记录。有时我需要删除大量记录,例如可以说 500 万条记录。正如您可能猜到的那样,这需要大量的时间和资源。问题是我不需要很多资源来做其他事情。为了在 30 分钟或更长时间内不将 DTU 固定在 100%,我需要拥有更多正常使用下所需的资源。我不在乎删除在合理范围内需要多长时间。根据我的研究,我找不到限制使用的好方法。如果我能以某种方式只允许 50% 的使用率用于操作或类似的东西,那就太好了。也许我错过了一些可以提高删除效率的东西,但我不这么认为。它是一个非常简单的表,在我用来删除的列上有一个索引。看起来最大的主要组件是数据 IO。如果有人对我如何管理这个有任何好的想法,我们将不胜感激。

在此处输入图片说明

Fra*_*ein 5

1)循环中按块删除。检查一下:如何在没有日志的情况下删除SQL中表的大数据?

2)使用分区并按分区截断。检查这个:https://stackify.com/how-to-partition-tables-in-azure-sql/


The*_*war 5

删除涉及定位数据、从磁盘获取数据并记录这些操作。

定位数据/最小化 IO:
为了确保 IO 最小化,您需要添加正确的索引。有时一些涉及删除的操作符可能并行运行,为避免这种情况,您需要添加 maxdop 提示以确保此查询中没有任何内容并行运行。

delete from table where somecol=someval
option(maxdop 1)
Run Code Online (Sandbox Code Playgroud)

最小化日志操作:
每个 DML 操作都会被记录下来,但是当您进行单独的删除时,您将使用更多的日志 IO(这是 AZure 数据库的 DTU 指标之一)..您必须批量删除并确保它们在一个单笔交易..

while 1=1
begin
    delete top(1000) from table where id=someval
    if @@rowcount =0
    break;
    end
go
Run Code Online (Sandbox Code Playgroud)

您还可以对表进行分区以加快删除速度。Truncate 现在可用于从 sql 2016 开始的分区。

TRUNCATE TABLE tablename
WITH (PARTITIONS (1,2,3))
GO
Run Code Online (Sandbox Code Playgroud)

语法还允许您指定范围..

[ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }   
    [ , ...n ] ) ) ] 
Run Code Online (Sandbox Code Playgroud)

分区可以帮助您更多,仅当您想删除所有分区或不删除分区时。如果您执行此类删除更多,则可能需要设计表以帮助截断

进一步阅读和参考:https :
//www.sqlshack.com/sql-server-2016-enhancements-truncate-table-table-partitioning/