除了您已经获得的实际管理点和可疑使用负 id 来表示数据模型属性之外,这里还有一个有效的问题:给出一个 int id 从 0 到 N 的表,插入新的负值这些值会去哪里他们会导致额外的分裂吗?
初始行将放置在聚集索引叶页上,id 为 0 的行位于第一页,id 为 N 的行位于最后一页,填充中间的页面。当插入值为 -1 的第一行时,这将排在 id 为 0 的行之前,因此将向树中添加一个新页面(实际上将分配 8 个页面的范围,但这是不同的点)和将链接页面放在叶级链接列表前面的页面。这不会导致前第一页的页面拆分。在进一步插入值 -2、-3 等时,它们将转到同一个新页面,并且它们将被插入到正确的位置(-2 在 -1 之前,-3 在 -2 之前等),直到页面填满。进一步的插入将在此页面之前添加一个新页面,该页面将容纳更多的新值。插入正值 N+1,
所以基本上答案是这样的:在聚集索引的任一端插入都不应该导致页面拆分。页面拆分只能由两个现有键之间的插入引起。这实际上也扩展到非叶页面,集群两端的索引也可能不会拆分非叶页面。我当然不会在这里讨论更新的影响(如果增加可变长度列的长度,它们可能会导致拆分)。
最近在 SQL Server 博客圈中关于页面拆分的潜在性能问题的讨论很多,但我必须警告不要采取不必要的极端来避免它们。页面拆分是一种正常的索引操作。如果您发现自己处于插入期间页面拆分性能影响可见的环境中,那么“缓解”措施可能会给您带来更严重的打击,因为您将创建人为的页面闩锁热点,这些热点要糟糕得多影响每个插入。真实情况是,频繁拆分的长时间操作会导致高碎片化,从而影响数据访问时间。我说最好通过非高峰期定期索引维护操作(重组)来缓解这种情况。避免过早的优化,总是先测量。