azure 如何优化一个没有主键但列有时间戳的表的删除操作?

a64a0gku  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(121)

我的进程正在从Azure SQL数据库中的表'A'向备份表'B a执行 * 插入 * 操作,该表每天更新[截断和加载]。两个表中都存在列'TSP' [例如value =2022-12- 19 T22:06:01.950994]。一天中插入的所有行的TSP都是相同的。当天晚些时候,我应该删除较旧的数据。当前使用'delete from 'B',其中TSP〈a today-1day'逻辑是否有办法使用索引或其他方法优化此删除操作?
SSMS建议在表.TSP列上创建非聚集索引。我测试了它,但似乎没有太大的区别。如果这是数据:50 mil TSP 1 50 mil TSP 2 50 mil TSP 3我的期望是它会跳过扫描TSP 2,TSP 3行并删除TSP 1。然而,如果表没有索引,它将需要扫描所有150 mil行。

yhuiod9q

yhuiod9q1#

批处理删除操作利用视图来简化执行计划,这可以使用快速有序删除操作来实现。这是通过刷新表一次来实现的,这反过来又减少了所需的I/O量。

以下是查询示例:-

CREATE  TABLE tableA
(
id int,
TSP Datetime  DEFAULT  GETDATE(),
[Log] NVARCHAR(250)
)

WHILE @I <=1000 BEGIN  INSERT  INTO tableA VALUES(@I,  GETDATE()-1,  concat('Log message ', @I)  )  SET @I=@I+1 END

选项1:-使用CTE

;WITH DeleteData 
AS
(SELECT id, TSP,  Log FROM tableA 
WHERE  CAST(tsp AS  DATE)  =  CAST(GETDATE()  AS  DATE))
 
DELETE  FROM DeleteData

选项2:-使用SQL视图

CREATE  VIEW VW_tableA AS (SELECT  *  FROM tableA WHERE  CAST(tsp AS  DATE)  =  CAST(GETDATE()-1  AS  DATE))

delete  from VW_tableA

**参考1:**John Sansom在快速SQL服务器删除上使用的article
**参考2:**类似SO thread

相关问题