4

我有一个包含超过 5000 万条记录的数据库表,为了改进搜索,我必须创建一个非聚集索引,一旦我创建了一个,它需要 5 到 10 分钟才能创建,所以我猜它在后台对数据进行排序到索引。

因此,例如在向我的表中添加索引之前搜索很糟糕并且需要很长时间,当我添加非聚集索引时,搜索速度很快。

但那只是当我有 5000 万条记录时。

问题是,如果我在创建表时在向表中添加任何数据之前一开始就定义了索引怎么办?它会提供与我现在获得的相同的搜索性能吗?还是我必须不时删除并重新创建索引以定期对数据进行排序?

如果我的问题看起来很愚蠢,我很抱歉,我刚开始学习索引,这对我来说是一个令人困惑的话题。

4

4 回答 4

4

非聚集索引将索引字段的副本保存在为搜索优化的特殊结构中。在 5000 万条记录上创建索引显然需要一些时间。

创建索引后,它会在添加、删除或更新记录时自动维护,因此只有在系统或磁盘严重崩溃时才需要重新索引。

所以一般来说,最好在创建表的时候创建索引。

有一个称为“更新统计信息”的操作可以帮助查询优化器提高其搜索性能。详细信息因数据库引擎而异。

于 2013-09-27T19:03:54.377 回答
3

数据库索引的工作方式与书中的索引一样。

它实际上是指向表中正确行的指针,基于特定键(您为其定义索引的列)并对其进行排序。

所以,基本上,是的,如果您在插入数据之前创建索引,那么当您稍后在表加载大量记录时使用它时,您应该获得相同的搜索速度。

虽然,由于每次插入(或删除或更新特定键)记录都需要更新索引,因此插入(或删除或更新)大量数据会慢一些。

如果您在表上执行大量插入和删除操作,索引可能会变得支离破碎。因此,删除和重新创建它们通常是良好维护计划的一部分。

于 2013-09-27T19:04:34.760 回答
2

查看来自 ola hallengren 的免费脚本。一是关于索引维护和统计。

一般经验法则,

在 10 和 30 pct 之间的索引碎片,重新组织。

碎片> = 30 pct,重建。

重新组织后,您需要更新统计信息。

重建会自动完成。

索引是优化查询性能的重要组成部分。

  • 约翰

http://ola.hallengren.com/

于 2013-09-27T19:06:54.307 回答
1

可以在将数据插入相关表之前创建索引。假设更新涉及相关索引中涉及的字段,则每次插入或更新行时都会简单地更新索引。

当插入行时,索引可能会变得碎片化,以允许索引保持所需的逻辑顺序或索引中的行。例如,如果索引有 A、B 和 E 之类的行,并且您添加了包含 C 或 D 的行,则索引将被拆分,以便新行适合 B 和 E。这种碎片可以使用 Olla Hallengren 的脚本作为 Crafty 修复DBA 在他的回答中提到,但是根据您的系统存储的配置方式,这可能无济于事。

帮自己一个忙,看看http://www.brentozar.com/sql/index-all-about-sql-server-indexes/了解一些关于 SQL Server 索引的优秀信息。

于 2013-09-27T19:32:00.377 回答