如何设计索引以加快删除速度

ado*_*lot 5 performance sql-server-2005 database-design sql-server index-tuning

我想加快以下代码

delete from ssn_sdo
where       
           (art_id=@art_id and skl_id=@skl_id and @level=0 )
        or (art_id=@art_id and skl_id=@skl_id and @level=1 and tip=@tip)
        or (art_id=@art_id and skl_id=@skl_id and doc_id = @doc_id)
Run Code Online (Sandbox Code Playgroud)

我的服务器是 MS SQL-Server 2005。

art_idskl_iddoc_id是整数,而tip是varchar(10)类型。

我想在ssn_sdo表上创建一个索引,所以这个删除会更快。
我正在考虑做的是制作三个索引,每个索引都适用于每种情况:

doc_id (ASC), art_id (ASC), skl_id (ASC)  
skl_id (ASC), art_id (ASC), tip (ASC)  
skl_id (ASC), art_id (ASC),  
Run Code Online (Sandbox Code Playgroud)

或者有没有更好的方法来制作一个包含所有三种情况的索引。
我对索引很小心,因为我不想减慢此表中的插入速度。

Pau*_*aul 8

有点尴尬,我看不到如何评论,但我想问一下为什么你的情况不是:

delete from ssn_sdo
where       
       art_id=@art_id 
       and skl_id=@skl_id
       and (@level = 0 or (@level = 1 and tip=@tip) or doc_id = @doc_id)
Run Code Online (Sandbox Code Playgroud)

在添加任何其他索引之前或之后,不确定这是否有帮助,但是查看执行计划(实际)并查看是否实现了任何好处会很有趣。

  • +1 这使我建议的索引和答案更加明显。 (3认同)

gbn*_*gbn 7

一个索引(art_id, skl_id, doc_id, tip)很可能就足够了

所有条件都开始(art_id, skl_id),应该进行搜索,然后对其中一个或将进行剩余查找doc_idtip

索引也可以(skl_id, art_id, doc_id, tip)基于每列中唯一值的数量:最唯一性应该放在第一位

多个索引意味着缓存的查询计划对于不同的条件可能不是最优的

当然,如果art_id/skl_id中的一个或两个已经是聚集索引,那么您可能不需要索引,因为它会在聚集索引上查找,然后做一个残差。如果doc_id是聚集索引,那么你需要额外的索引