我有一个CRM系统,正在其中查看SQL Server 2017数据库的结构。
History在Date_Entered(datetime)和Time_Entered(varchar(8))上有一个聚集索引的表。大约有3000万行(并且还在不断增加)。
打开客户记录后,他们的最新历史记录将按相反的日期/时间顺序显示。
随着索引升序,新行将添加到表的末尾。如果我要按降序的日期/时间顺序重建它,则我认为显示记录会更快(尽管无论如何它都不会很慢),但是这意味着新记录将被插入到开头,因此导致恒定的页面拆分,不是这样吗?
1个
您最终不会出现恒定的页面拆分。您可能认为这是因为您对聚簇索引的思维方式有误,并认为它们按物理顺序存储,因此必须以某种方式在物理上插入新行。事实并非如此。
但是-请勿这样做,因为最终会产生99.x%的逻辑碎片,而不会进行页面拆分。新的物理页面倾向于在文件中比以前的页面更晚地分配,而索引的逻辑顺序将需要从更早的位置开始分配它们(示例)。
假设按顺序插入,Date_Entered, Time_Entered则将填充每个新页面,然后分配并填充一个新页面。无需在页面之间移动行的页面拆分-只需分配新页面即可。唯一的问题是,除非重建或重新组织索引,否则物理页面顺序可能会完全颠倒逻辑索引顺序。
我认为显示记录会更快
不,因为索引的叶子页在双向链接列表中链接在一起,并且可以向前或向后读取,所以无论如何都不需要。
向后扫描无法并行化,但希望您不必担心。
无论如何,为了显示客户记录,您可能都在使用不同的索引,而前导列customerid使其与此无关。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。