Rem*_*anu 10
在SQL Server行格式中描述MSDN,也分析了各种博客,像保罗·兰德尔的一个记录的剖析.重要信息是记录结构:
- 记录标题
- 4个字节长
- 两个字节的记录元数据(记录类型)
- 在记录中向前指向NULL位图的两个字节
- 记录的固定长度部分,包含存储具有固定长度的数据类型的列(例如bigint,char(10),datetime)
- NULL位图
- 记录中列数的两个字节
- 无论列是否可为空,在记录中每列存储一位的可变字节数
- 这允许在读取NULL列时进行优化
- 可变长度列偏移数组
- 两个字节用于可变长度列的计数
- 每个可变长度列两个字节,给出列值末尾的偏移量
- 版本标记
- 一个14字节的结构,包含一个时间戳加上一个指向tempdb中版本存储的指针
因此NULL字段在NULL位图中设置了一个位.
我怀疑采访者是否希望你确切知道SQL服务器的存储方式null,这个问题的关键在于让你思考如何存储特殊值.您不能使用标记值(或幻数),因为这会使任何具有该值的行突然变为null.
有很多方法可以实现这一目标.想到的最直接的2是有一个标志存储每个可以为空的值,isNull这个值基本上是一个标志(这也基本上是Nullable<T>在.NET中有效).第二种方法是在每行中存储空标志的位图,每列一个.
面对这样的面试问题时,绝对最糟糕的反应是坐下来茫然地盯着.大声思考,承认你不知道SQL Server是如何做到的,然后提出一些合理的方法来做到这一点.您还应该准备好谈谈为什么选择一种方法而不是另一种方法,以及每种方法的优点和缺点.
| 归档时间: |
|
| 查看次数: |
950 次 |
| 最近记录: |