Tsql 针对超大表和昂贵删除操作的数据库优化策略

Tsql 针对超大表和昂贵删除操作的数据库优化策略,tsql,database-design,relational-database,database-optimization,Tsql,Database Design,Relational Database,Database Optimization,我们的数据库有一个包含数百万行数据的非常大的表。一些旧代码是我几年前从一个幼稚的角度编写的,不能处理糟糕的数据库性能。数据库本身也是在我的实际知识有限的情况下建立的 这个表(根据用例的必要性)有大量多余的行,应该(我认为)随着时间的推移进行清理。最后,我将编写一些例程,每天自动执行此清理(从而降低成本) 然而,与此同时,我需要提出一种优化方法。我没有任何为数据库编写索引的经验,所以我想我必须在那里做一些学习 到目前为止,我的方法是删除多余的行: SET NOCOUNT ON; DECLARE @

我们的数据库有一个包含数百万行数据的非常大的表。一些旧代码是我几年前从一个幼稚的角度编写的,不能处理糟糕的数据库性能。数据库本身也是在我的实际知识有限的情况下建立的

这个表(根据用例的必要性)有大量多余的行,应该(我认为)随着时间的推移进行清理。最后,我将编写一些例程,每天自动执行此清理(从而降低成本)

然而,与此同时,我需要提出一种优化方法。我没有任何为数据库编写索引的经验,所以我想我必须在那里做一些学习

到目前为止,我的方法是删除多余的行:

SET NOCOUNT ON;
DECLARE @r INT;
SET @r =1;
While @r > 0
    BEGIN
        BEGIN TRANSACTION;
        DELETE TOP (100)
        From [Shift Offer] 
        WHERE offer_timestamp IS NULL
            AND callout_id_fk < 18605 
            AND call_round_id_fk IS NULL
        SET @r = @@ROWCOUNT;
        COMMIT TRANSACTION;
    END
设置不计数;
声明@r INT;
设置@r=1;
而@r>0
开始
开始交易;
删除顶部(100)
来自[轮班优惠]
其中,offer_时间戳为空
和标注_id _fk<18605
而call_round_id_fk为空
设置@r=@@ROWCOUNT;
提交事务;
结束
以前,我有Top(1000)集,这导致了一些相当严重的性能下降

在读了一些书之后,我发现查看执行计划可以给我们一些启示。现在,我可以看到这个查询中的问题是(我认为)聚集索引的存在导致了写操作的缓慢

该表是非规范化的,因此在执行读取或更新操作时,它不会执行大量的联接(如果有的话)。每个数据块(由callout_id_fk定义)最多只处理几天,然后仅存储用于记录保存目的

但随着表格的增长,出现了一些性能问题。其中一个是当我使用删除操作意外降低性能时,我实际上能够重现的。因此,这告诉我,我们当然需要在这里进行一些数据库调优,另外还要编写软件代码,以便在处理糟糕性能方面更加健壮

所以我只剩下这个问题了。删除有问题的多余行是一种糟糕的方法吗?是否可以通过将一些想法放在索引我们有问题的表上(而不是让Azure进行索引)来改进数据库?我应该同时删除行和创建索引吗

最后,我应该删除索引,执行删除操作,然后重新创建每个索引吗?我不确定在运行此操作时删除索引是否会加剧性能问题,因此我很好奇其他人会认为什么是好方法。

select 2
select 2
while (@@rowcount > 0)
begin 
     delete top(200)
     From [Shift Offer] 
     WHERE offer_timestamp IS NULL
       AND callout_id_fk < 18605 
       AND call_round_id_fk IS NUL
end
而(@@rowcount>0) 开始 删除顶部(200) 来自[轮班优惠] 其中,offer_时间戳为空 和标注_id _fk<18605 然后叫我轮,我是NUL 结束
我在这里看到了一个非常接近的投票结果,因此如果管理员认为这更适合dba.stackexchange,请随意将其移动到那里。因此我成功地大幅提高了搜索速度。我做了一个选择TOP(100)的实验,显然出于某种原因,它真的不喜欢寻找call\u round\u id\u fk。我想这应该没问题,因为这只是一个预防措施。想补充一些解释吗?@ScubaSteve,你试过了吗。你不明白什么?你的代码和我的代码几乎完全一样。。。有什么区别?首先,它要短得多。你又试过了吗?对不起,我帮不上忙。我不想和你争论。