IT序号网

sql之Azure SQL 大量删除

me-sa 2025年01月19日 编程语言 22 0

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

请您参考如下方法:

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

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

delete from table where somecol=someval 
option(maxdop 1) 

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

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

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

TRUNCATE TABLE tablename 
WITH (PARTITIONS (1,2,3)) 
GO 

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

[ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }    
    [ , ...n ] ) ) ]  

只有当您想要删除分区的全部或全部或全部删除时,分区才能为您提供更多帮助。如果您更多地进行此类删除,则可能需要设计表以帮助截断

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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!