如上所述here数据库中的聚簇索引会影响数据在磁盘上的物理分配方式。
这是否意味着如果我有一个巨大的数据库表并且决定我想要更改PRIMARY KEY它会导致重新排列物理数据?
此操作需要多少可用空间(如果需要)?
让我们说我的db文件包含一个表,大小为100 GB。
答案 0 :(得分:0)
对于第一个问题:是的,当您更改CLUSTERED INDEX
时,表示数据将重新排列。 (事实上,如果你改变任何索引,那么存储在索引中的数据将被重新排列以适应新的定义。)
第二部分是你不能改变任何索引,这意味着你应该DROP
旧索引和CREATE
新索引。这意味着将删除与旧索引相关的数据,并将新索引的数据存储在磁盘上。
当您放弃CLUSTERED INDEX
时,会发生一些事情:
HEAP
表,并且将为每一行生成行标识符(RID)。NONCLUSTERED INDEX
都将被重建,因为它们引用了CLUSTERED INDEX
密钥或HEAP RID
有关可用空间要求,您可以从这里开始:http://msdn.microsoft.com/en-us/library/ms179542(v=sql.110).aspx
从该页面开始:
需要额外磁盘空间的索引操作
所有其他索引DDL操作都需要在操作期间使用额外的临时磁盘空间,并且需要永久磁盘空间来存储新的索引结构。
创建新索引结构时,在适当的文件和文件组中需要旧(源)和新(目标)结构的磁盘空间。在索引创建事务提交之前,不会释放旧结构。
以下索引DDL操作会创建新的索引结构并需要额外的磁盘空间:
用于排序的临时磁盘空间
除了源和目标结构所需的磁盘空间之外,排序还需要临时磁盘空间,除非查询优化器找到不需要排序的执行计划。
如果需要排序,则一次排序一个新索引。例如,在单个语句中重建聚簇索引和关联的非聚簇索引时,索引将依次排序。因此,排序所需的额外临时磁盘空间必须与操作中的最大索引一样大。这几乎总是聚集索引。
如果SORT_IN_TEMPDB选项设置为ON,则最大索引必须适合tempdb。虽然此选项会增加用于创建索引的临时磁盘空间量,但是当tempdb位于与用户数据库不同的一组磁盘上时,它可能会缩短创建索引所需的时间。
如果SORT_IN_TEMPDB设置为OFF(默认值),则每个索引(包括分区索引)都会在其目标磁盘空间中排序;并且只需要新索引结构的磁盘空间。 有关计算磁盘空间的示例,请参阅索引磁盘空间示例。