我有一张桌子,上面有大约100万到500万条记录。该记录的一小部分将bit列之一设置为“ TRUE”。需要快速找到该记录。我认为该索引可以加快在此列上的搜索,但是我担心INSERT。因此,我的问题。
数据库的工作就像某种数据仓库,因此有很多SELECT和小的选择(每天最多10到20个),但有很大的INSERT(一次最多有20万条记录)。我担心导入数据库的时间较长。
我有一张桌子,上面有大约100万到500万条记录。该记录的一小部分将bit列之一设置为“ TRUE”。需要快速找到该记录。我认为该索引可以加快在此列上的搜索,但是我担心INSERT。因此,我的问题。
数据库的工作就像某种数据仓库,因此有很多SELECT和小的选择(每天最多10到20个),但有很大的INSERT(一次最多有20万条记录)。我担心导入数据库的时间较长。
Answers:
一百万条记录的索引毫无用处。优化器永远不会使用它,您只需为维护它付费。更好的选择是将此位添加为聚簇索引的最左键。
但是我会在黑暗中瞎眼,然后猜测您所拥有的是队列模式:将记录放到表中,并将位设置为“ TRUE”(即“ needsprocessing = true”),然后查找后台进程对于这些记录,请进行一些处理,然后将该位更新为FALSE。这是一个无所不在的模式,也被亲切地称为“性能灾难配方模式”。我建议同时将记录放入表中,并将通知(可能与新插入的记录ID一样简单)同时放入队列中。请参阅将表用作队列。
正如@MartinSmith所说,如果您升级到SQL 2008,则过滤索引将是理想的解决方案。但是,在一般情况下,任何时候添加任何索引都会增加您的加载时间。小索引比大索引少。
我要看的一件事是,如果您有一个可以修改的现有索引。假设现有查询正在使用给定索引,则将bit列添加到该索引的末尾对插入的影响最小,而对查询的影响则很小。
接下来要看的是“我已经有很多索引了吗?” 关于“多少”没有硬性规定,但是除非我真的需要一个新的索引,否则通常以10个索引为限。
最后想到的是,在测试实例上进行测试。设置一个包含几百万行的表,对其进行加载,添加索引,然后再次运行加载,看看是否发现加载时间显着增加。
只有您才能真正决定“重要”是什么。我的机器在加载时间上增加了5分钟是“显着的”,而在其他机器上我可以安全地看到增加了几个小时。
编辑:
另一个选择是对表进行分区。如果您不使用企业版,则可能必须使用分区视图,即使这样也应有所帮助。您将0位放在一个分区中,将1位放在另一个分区中。假设您仅插入一个版本或另一个版本,那么您甚至可以加快插入速度。