【发布时间】: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