为什么SQL Server 2012不能将包含的列添加到现有的非聚集索引

时间:2015-07-01 21:27:32

标签: sql-server database indexing

我不明白为什么它不像

那么简单
alter index whatever add included (columnName)

什么会阻止这是一个简单的SQL Server操作,它会将列添加到索引并填充表中页面的值?

这不会影响所有索引的排序,只是尝试优化select语句。我希望我可以减少停机时间,而不是目前需要8小时才能放下并重建一套索引,但我感到非常失望。

1 个答案:

答案 0 :(得分:3)

因为包含的列位于索引页面中,所以目前您有类似的内容:

页   第1行:键1,键2,Inc 1第2行:键1,键2,Inc 1,第3行:键1,键2,Inc 1 ......

如果第1行从字节0开始,第2行在字节x,等等

要添加新的包含列,您需要获取每个页面,将其分成行添加列然后重新编写它,可能只在1页或超过1页,包括前几页的元数据这指向它 - 实际上你必须完全重写索引,所以为什么不重建它。

SQL Server构建新索引比在这里和那里插入少量数据更便宜。

编辑:你显然会得到索引碎片,所以你需要重建它