开发者社区> 问答> 正文

聚集索引顺序

我有一个CRM系统,正在其中查看SQL Server 2017数据库的结构。

History在Date_Entered(datetime)和Time_Entered(varchar(8))上有一个聚集索引的表。大约有3000万行(并且还在不断增加)。

打开客户记录后,他们的最新历史记录将按相反的日期/时间顺序显示。

随着索引升序,新行将添加到表的末尾。如果我要按降序的日期/时间顺序重建它,则我认为显示记录会更快(尽管无论如何它都不会很慢),但是这意味着新记录将被插入到开头,因此导致恒定的页面拆分,不是这样吗?

展开
收起
祖安文状元 2020-01-04 15:36:50 749 0
1 条回答
写回答
取消 提交回答
  • 1个

    您最终不会出现恒定的页面拆分。您可能认为这是因为您对聚簇索引的思维方式有误,并认为它们按物理顺序存储,因此必须以某种方式在物理上插入新行。事实并非如此。

    但是-请勿这样做,因为最终会产生99.x%的逻辑碎片,而不会进行页面拆分。新的物理页面倾向于在文件中比以前的页面更晚地分配,而索引的逻辑顺序将需要从更早的位置开始分配它们(示例)。

    假设按顺序插入,Date_Entered, Time_Entered则将填充每个新页面,然后分配并填充一个新页面。无需在页面之间移动行的页面拆分-只需分配新页面即可。唯一的问题是,除非重建或重新组织索引,否则物理页面顺序可能会完全颠倒逻辑索引顺序。

    我认为显示记录会更快

    不,因为索引的叶子页在双向链接列表中链接在一起,并且可以向前或向后读取,所以无论如何都不需要。

    向后扫描无法并行化,但希望您不必担心。

    无论如何,为了显示客户记录,您可能都在使用不同的索引,而前导列customerid使其与此无关。

    2020-01-04 15:36:59
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载