PeterJL Asked: 2019-01-22 07:50:01 +0800 CST2019-01-22 07:50:01 +0800 CST 2019-01-22 07:50:01 +0800 CST NC 索引的包含列中的 nvarchar(max) 772 将 nvarchar(max) 添加到具有一个 nchar(16) 列键列的 NC 索引的包含列中会导致 20+ 百万行的重建问题吗? 我所说的“重建问题”是指重建索引需要很长时间。我认为“包含”列与键列的处理方式不同,不会对集群产生太大影响。 sql-server sql-server-2012 1 个回答 Voted Best Answer Josh Darnell 2019-01-22T10:59:24+08:002019-01-22T10:59:24+08:00 是的,重建该索引可能会慢很多。 基线它将是您磁盘上此数据的完整额外副本。如果列被频繁更新,那么它可能会导致索引更快地碎片化。索引中的数据越多,删除和重新创建(“重建”)所需的时间就越长。 通常不建议将大型数据类型添加为非聚集索引中的包含列。它会导致更少的行适合页面(或指向行外存储的指针),从而导致在查询该索引时必须读取更多的页面。正如您可以想象的那样,它将需要更多的 RAM 来将这些索引页保存在内存中。 您可能希望进行性能测试以确保此包含列的好处(大概是为了避免键查找?)超过上述成本。 当然,影响的程度在很大程度上取决于实践中实际存储在该列中的数据量。 你是对的,包含的列被区别对待,因为它们不影响索引数据的存储顺序。但它们仍然包含在索引的叶级别,因此它们肯定会导致您的重建花费更长的时间。在更新时,包含的列通常会比键列产生更少的开销,因为如果顺序更改,它们不会导致行被打乱。但重建实际上只是删除并重新创建整个索引。
是的,重建该索引可能会慢很多。
基线它将是您磁盘上此数据的完整额外副本。如果列被频繁更新,那么它可能会导致索引更快地碎片化。索引中的数据越多,删除和重新创建(“重建”)所需的时间就越长。
通常不建议将大型数据类型添加为非聚集索引中的包含列。它会导致更少的行适合页面(或指向行外存储的指针),从而导致在查询该索引时必须读取更多的页面。正如您可以想象的那样,它将需要更多的 RAM 来将这些索引页保存在内存中。
您可能希望进行性能测试以确保此包含列的好处(大概是为了避免键查找?)超过上述成本。
当然,影响的程度在很大程度上取决于实践中实际存储在该列中的数据量。
你是对的,包含的列被区别对待,因为它们不影响索引数据的存储顺序。但它们仍然包含在索引的叶级别,因此它们肯定会导致您的重建花费更长的时间。在更新时,包含的列通常会比键列产生更少的开销,因为如果顺序更改,它们不会导致行被打乱。但重建实际上只是删除并重新创建整个索引。