2014-10-26 67 views
1

我知道当我们用SQL Server主键创建一个表时,会自动创建一个聚集索引。但是,如果我从这个表中删除一行,与此行相关的聚集索引是否仍然保留在索引表中,或者它会自动删除?如果它没有被自动删除,我是否必须创建一个作业来重建和重新组织索引? (是限于MySQL,Oracle等一样吗?)SQL Server中的群集索引

+0

当然,聚集索引(像任何其他索引)不断更新。这就是为什么太多索引可能比没有索引更糟!有一个索引**总是**也承担着维护它的重任! – 2014-10-26 18:03:58

回答

1

Oracle或MySQL的默认值不相同。每个数据库都有其自己的默认值及其特定功能。有些甚至对不同的含义使用相同的术语。

Oracle不默认为聚集索引,而在Oracle中,等效索引组织表为。在Oracle中,CLUSTER的定义是一个可以存储2个或更多表并将它们排序相同的结构。

如果不是自动删除,我是否必须创建一个作业到 重建和重新组织索引?

重建索引#1规则 - 衡量,测量,衡量。证明重建是有益的,否则除非事情发生变化,否则不要费心去做。

简单删除(或千)不是重建索引的自动原因。

如果您即将重建索引,您应该知道(1)前后访问时间前后的数据块数量(2)。

作为一般的做法,索引重建有许多错误信息和迷信。您所指的索引是B-Tree结构。这些设计是可扩展的,O(日志N)访问。没有证据表明索引必须在默认情况下重新组织。每个指标都是它自己的动物。 B树指标在一段时间后达到停滞点(平衡),当你重建它们时,它们会压缩它们(一件好事),但它们最终会回到停滞点。除非我在其中一个人身上发现性能/ IO问题,否则我会根据具体情况手动进行。

重建的两个最大的优点:

  1. 更密集组合数据到更少的块,从而提高了缓存和IO。
  2. 通过累积的实际数据对非聚簇索引进行重新排序。如果你的访问模式总是连续的(包括插入),那么这通常不是问题,块将被排序。

Oracle和SQL Server是很棒的技术。没有证据的情况下重建索引对于专业DBA来说并不合适。

+1

为了清楚起见,重建的意图总是为1.更加密集地将数据打包到更少的块中,这样可以改善缓存和IO.'您可能会为插入等提供空间,这取决于您如何选择聚簇索引该页面拆分不是一个问题。这实际上与所描述的相反。我不是挑选,只是指出我实际遇到的用例。 – 2014-11-01 20:48:08

2

我知道,当我们创建一个SQLSERVER表的主键,将自动创建一个 聚集索引。

这只有当它是默认选项或者将clustered指定为关键字时才是如此。主键也可以是非聚簇索引。

但是,如果我从该表中删除一行,并与该行的索引表中仍然保留的聚集索引 或者 自动删除?

如果它确实是一个聚集索引,那么索引是表数据。如果你从表格中删除了一些东西,它就消失了。有一些内部工作,例如幽灵记录,但是数据不见了(从应用程序的角度来看)。

如果不是自动删除,我是否必须创建一个作业到 重建和重新组织索引?

也就是说,还有其他背景任务可以处理某些“隐藏”功能。最终,当碎片(内部或外部)开始成为问题时,您会希望重新组织或重建索引。这将取决于其他因素,包括表结构,接入等

(是限于MySQL,Oracle等一样吗?)

问题被标记的SQL Server,所以我回答SQL Server标记。这对于单个帖子来说是一个非常广泛的问题。

相关问题