繁体   English   中英

我是否必须时不时地创建某个非聚集索引?

[英]Do i have to create a certain nonclustered index every now and then?

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

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

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

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

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

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

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

因此,通常,最好在创建表时创建索引。

有一项称为“更新统计信息”的操作可帮助查询优化器提高其搜索性能。 数据库引擎的细节有所不同。

数据库索引的工作方式类似于书籍。

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

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

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

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

查看ola hallengren的免费脚本。 一个是索引维护和统计。

一般经验法则,

索引碎片在10到30%之间,重新组织。

碎片> = 30 pct,重建。

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

重建会自动完成。

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

  • 约翰

http://ola.hallengren.com/

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM