索引SQL SERVER中的大表

时间:2008-11-12 18:12:56

标签: sql-server indexing

我有一张大桌子(超过一千万条记录)。此表大量用于在应用程序中搜索。所以,我不得不在桌面上创建索引。但是,在表中插入或更新记录时,我的性能会降低。这很可能是因为重新计算了索引。

有没有办法改善这一点。

提前致谢

5 个答案:

答案 0 :(得分:9)

您可以尝试通过减少索引的填充因子来减少页面拆分的数量(在索引中)。默认情况下,填充因子为0(与100%相同)。因此,当您重建索引时,页面将完全填满。这适用于未修改的表(插入/更新/删除)。但是,在修改数据时,索引需要更改。如果填充因子为0,则可以保证页面拆分。

通过修改填充因子,您应该在插入和更新时获得更好的性能,因为页面不总是必须拆分。我建议您使用填充因子= 90重建索引。这将使页面的10%空,这将导致页面拆分更少,因此I / O更少。 90可能不是最佳使用价值,因此这里可能涉及一些“试验和错误”。

通过使用不同的填充因子值,您的选择查询可能会稍微变慢,但填充因子为90%时,您可能不会注意到太多。

答案 1 :(得分:2)

我们需要查看您的索引,但可能是。

要记住的一些事情是,您不希望仅在每个列上放置索引,并且通常不希望每个索引只有一列。

最好的办法是,您可以记录一些实际搜索,跟踪用户实际搜索的内容,并创建针对这些特定类型搜索的索引。

答案 2 :(得分:2)

您可以选择多种解决方案

a)您可以对表格进行分区

b)考虑在非高峰时段(如夜间)批量执行更新

c)由于工程是权衡的平衡行为,你必须选择哪个更重要(选择或更新/插入/删除)以及哪个操作更重要。假设您不需要实时获得“插入”的结果,您可以使用Sql server服务代理来执行这些操作,以异步方式执行“不太重要”的操作

http://msdn.microsoft.com/en-us/library/ms166043(SQL.90).aspx

由于 -RVZ

答案 3 :(得分:0)

这是一个经典的工程权衡...你可以使铲子更轻或更强,从不两者......(直到材料科学的突破。)

更多索引意味着更多DML维护,意味着更快的查询。

较少的索引意味着DML维护较少,意味着查询速度较慢。

有些索引可能是多余的,可以合并。

除了Joel写的内容之外,您还需要为DML定义SLA。可以慢一些,你注意到它放慢了速度,但它确实比你已经实现的查询改进真的很重要...... IOW,是否可以使用轻型铲子?

答案 4 :(得分:0)

如果您的聚簇索引不在标识数字字段中,重新排列页面可能会降低您的速度。如果是这种情况,你可以看看你是否可以通过使它成为非聚集索引来提高速度(比没有索引更快但往往比聚簇索引慢一点,所以你的选择可能会减慢但插入改进)

我发现用户更愿意容忍稍慢的插入或更新到较慢的选择。这是一般规则,但如果它变得无法接受缓慢(或更糟糕的时候),没有人可以处理这个问题。