假设我有一个固定长度的列,我SELECT
从它开始,比如 100 行。在读取固定长度列的不同行时,SQL Server 是检查每一行的列长度还是检查一次并重用此信息以便可以更快地读取后续行?
相反,对于可变长度列,SQL Server 需要使用偏移数组检查每一行的每个可变长度列的长度。
所以我的问题是:SQL Server 是否检查每一行的固定长度数据类型的长度(即在行的状态位 A 和 B 部分之后)?从逻辑上讲,当它需要读取一个固定长度的列时,它只需要检查一次。
这是为什么索引最适合固定长度列的原因吗?
不试图解决任何问题,只是试图理解。
额外信息:关于固定长度列上的索引最好:当我阅读这篇文章SQL Server 性能的索引策略时,这整个问题就开始了。有一次它说:“聚集索引键应该很窄,但也应该使用固定宽度的数据类型。” 这种说法的原因是什么?我只能想到与我的问题有关的原因,即固定长度的列更便宜,因为长度只需要检查一次。
在FixedVar存储格式中,每个定长列在每一行中出现在相同的偏移量处。
SQL Server 缓存所需的每个固定长度列的偏移量,并在后续行访问中重用该信息。它不会为每一行重新计算偏移量。
因此,从行的固定长度部分访问数据与读取可变长度数据相比具有较小的效率优势。它并不像您想象的那么多,因为查找可变长度数据只涉及到一些额外的 CPU 指令,这些指令很可能已经在 L1 缓存中(尽管不一定在同一行)。
如果您测试在固定和可变存储中访问大量相同的数据,您可能能够测量出微小的差异。我还没有看到任何关于现代硬件的最新结果。通常还有其他与行模式查询执行相关的开销,我预计这些开销会超过这种效果。
总结:我不会特意选择固定长度类型而不是可变长度类型。选择最适合手头应用程序的数据类型。
二级 b 树索引是一个单独的结构,其中包含根据索引键排序的索引数据的副本。上述相同的一般注意事项适用于从索引页读取数据和从数据页读取数据。
二级 b 树索引必须包括行定位符(聚集索引键和可能的唯一符)。当聚集索引键包含可变长度数据类型时,任何二级 b 树索引行可能对可变长度列的数量和可变列偏移数组有额外的开销。因此,二级索引可能比它们需要的要宽一些。我相信这就是保罗兰德尔在这句话中所暗示的观点。