gpt4 book ai didi

sql - Azure SQL 大量删除

转载 作者:行者123 更新时间:2023-12-02 08:08:28 24 4
gpt4 key购买 nike

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

enter image description here

最佳答案

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

定位数据/最小化 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/

关于sql - Azure SQL 大量删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49287138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com