【问题标题】:Delete Few rows from Large table SQL Sever 2017从大表 SQL Server 2017 中删除几行
【发布时间】:2020-01-23 20:13:26
【问题描述】:

我有这个有 900,000,000 行的分区表 (test_table)。表没有键。它在 [ p_date 和 email ] 列上只有 1 个聚集索引。

每天都有一个从 SP 运行的进程试图从该表中删除。

Delete from test_table 
where userKey = 1
and convert(date, p_date) in (select distinct convert(date, p_date)
                                from    DB5.dbo.[test_table])

子查询在其他数据库中运行,但速度超快,并返回今天的日期。

在删除之后还有一个插入语句,它每天插入大约 70,000 行。这样更快。

此 SP 每天运行。

删除需要很长时间。

当我检查 sysprocess 时,我看到了,

仅基于此信息,我才能找到它正在处理的 db_id、哪个文件组、哪个表和哪个索引。

现在它正在处理 db_id =7 的文件组 ID = 16。我们有 32 个文件组。 这里有什么方法可以加快删除的性能吗?

这是具有 128 GB RAM 的强大机器。那时没有其他进程正在运行。谢谢。

【问题讨论】:

  • 使用子查询而不是 GETDATE() 函数的原因是什么?

标签: sql sql-server database-performance


【解决方案1】:

删除 p_date 上的非sargable 谓词以启用索引查找和分区消除。

尝试类似:

Delete from test_table 
where userKey = 1
and p_date >= @start and p_date < @end
option (recompile)

Delete from test_table 
where userKey = 1
and p_date >= @start and p_date < dateadd(day,1,@start)
option (recompile)

即使您必须运行多个此类查询。

【讨论】:

  • 如果@start@end 每天都不同,这可能会导致参数嗅探。考虑使用OPTION RECOMPILE
【解决方案2】:

另一种方法是,

  1. 将所有数据检索到临时表中。
  2. 从主表中删除记录。
  3. 将临时表中的记录插入到满足给定日期范围的主表中。

【讨论】:

    猜你喜欢
    • 2023-02-16
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多