the*_*220 5 sql azure sql-delete azure-sql-database
我目前正在使用 Azure 托管的 SQL 服务器实例处理应用程序。应用程序数据不占用大量物理空间,但有很多记录。有时我需要删除大量记录,例如可以说 500 万条记录。正如您可能猜到的那样,这需要大量的时间和资源。问题是我不需要很多资源来做其他事情。为了在 30 分钟或更长时间内不将 DTU 固定在 100%,我需要拥有更多正常使用下所需的资源。我不在乎删除在合理范围内需要多长时间。根据我的研究,我找不到限制使用的好方法。如果我能以某种方式只允许 50% 的使用率用于操作或类似的东西,那就太好了。也许我错过了一些可以提高删除效率的东西,但我不这么认为。它是一个非常简单的表,在我用来删除的列上有一个索引。看起来最大的主要组件是数据 IO。如果有人对我如何管理这个有任何好的想法,我们将不胜感激。
1)循环中按块删除。检查一下:如何在没有日志的情况下删除SQL中表的大数据?
2)使用分区并按分区截断。检查这个:https://stackify.com/how-to-partition-tables-in-azure-sql/
删除涉及定位数据、从磁盘获取数据并记录这些操作。
定位数据/最小化 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/
| 归档时间: |
|
| 查看次数: |
3019 次 |
| 最近记录: |