在位列上添加索引会显着减慢插入速度吗?

mar*_*osh 11 sql-server-2005 sql-server

我有一张大约有 100 万到 500 万条记录的表。该记录的一小部分将位列之一设置为“TRUE”。需要快速找到那个记录。我认为该索引可以加快对该列的搜索速度,但我担心 INSERT。因此我的问题。

数据库的工作方式类似于数据仓库,因此有许多 SELECT 和小(每天最多 10-20 个)但相当大的 INSERT(一次最多 20 万条记录)。我担心导入到数据库的时间会更长。

Rem*_*anu 8

100 万条记录的位索引是没有用的。优化器永远不会使用它,您只需为维护它付费。更好的选择是将此位添加为聚集索引上最左边的键。

但是我会在黑暗中盲目地猜测你所拥有的是一个队列模式:记录被丢弃在表中,位设置为“TRUE”(即“needsprocessing = true”),然后后台进程看起来对于这些记录,进行一些处理,并将该位更新为 FALSE。这是一种无所不在的模式,也被亲切地称为“性能灾难食谱模式”。我建议将记录放入表中,同时将通知(可以像新插入的记录 ID 一样简单)放入队列中。请参阅使用表作为队列

  • 实际上我进行了测试,是的,它将使用索引。创建一个表(Id 标识,myBit 位)在位为 0 的地方添加 100 行,在位为 1 的地方添加 2000000。确保更新统计信息(如果需要)并在 myBit = 0 上运行查询并使用索引。 (2认同)

Ken*_*her 2

正如 @MartinSmith 所说,如果您升级到 SQL 2008,那么过滤索引将是完美的解决方案。然而,与此同时,一般情况下,任何添加的索引都会增加您的加载时间。小索引不如大索引。

我要考虑的一件事是您是否有可以修改的现有索引。假设您现有的查询正在使用给定的索引,那么将位列添加到该索引的末尾应该对插入和您在查询中看到的积极影响最小。

接下来要注意的是“我已经有很多索引了吗?” 对于什么是“很多”,没有硬性规定,但我通常遵循的规则是 10 个索引就是限制,除非我真的需要一个新索引。

最后一个想法,在测试实例上进行测试。设置一个包含几百万行的表,在其上运行负载,添加索引,然后再次运行负载,看看是否注意到加载时间显着增加。

只有你才能真正决定什么是“重要”。在我的机器上,加载时间增加 5 分钟是“显着”的,而在其他机器上,我可以安全地看到加载时间增加几个小时。

编辑:

另一种选择是对表进行分区。如果您不使用企业版,您可能必须使用分区视图,但即使如此它也应该有所帮助。您将位 0 ​​放入一个分区,将位 1 放入另一分区。假设您只插入一个版本或另一个版本,那么您甚至可以加快插入速度。