我想加快以下代码
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)
我的服务器是 MS SQL-Server 2005。
art_id
,skl_id
和doc_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),
或者是否有更好的方法来制作一个包含所有三种情况的索引。
我对索引很小心,因为我不想减慢在此表中的插入速度。
有点尴尬,我看不出如何评论,但我想问问为什么你的情况不是:
在添加任何进一步的索引之前或之后完全不确定是否有帮助,但是查看执行计划(实际)并查看是否实现了任何好处会很有趣。
一个索引
(art_id, skl_id, doc_id, tip)
很可能就足够了所有条件都开始
(art_id, skl_id)
,应该进行查找,然后对其中之一进行剩余查找doc_id
ortip
将在之后完成索引也可以
(skl_id, art_id, doc_id, tip)
基于每列中唯一值的数量:大多数唯一性应该排在第一位多个索引意味着缓存的查询计划对于不同的条件可能不是最优的
当然,如果
art_id
/skl_id
中的一个或两个已经是聚集索引,那么你可能不需要索引,因为它会在聚集索引上查找,然后做残差。如果doc_id
是聚集索引那么你需要额外的索引