在设计一个关于应该声明列的顺序的新表时,是否应该考虑任何因素?我倾向于首先放置主键,然后是任何外键(通常是代理键整数),然后是其他列,但是与同事的讨论让我们想知道SQL Server是否会填充我们的数据,可能会使它更快。 / p>
出于性能原因(C ++编译器在默认条件下对齐结构的方式),SQL Server是否会尝试将磁盘上的数据(使用填充)与特定的字节对齐边界对齐,或者它只分配与我们的字节数一样多的字节数总行需要(可能在行级填充)?即如果我们有一个3字节的char列和另一个类型为bit / tinyint的列,我们是否可以期望服务器中的行为(更好或更差)发生任何变化,使其中一个跟随另一个以4字节边界对齐? SQL Server是否甚至关心我声明列的顺序,还是可以自由地将它们排列在适当的位置?
据我所知,在尝试优化表格列的布局之前,我应该首先查看一百万件事情,但出于好奇心的考虑,我很想知道SQL Server是否关心列排序,如果那么,人们会去哪里(DMV等?)看看它是如何将行物理地放在磁盘上的。
答案 0 :(得分:3)
SQL Server以固定和固定的方式将数据存储在磁盘上。
sys.columns和键列中的顺序与此磁盘顺序无关联。
请参阅"Anatomy of a record"(Paul Randal)和我的回答:How do you get to limits of 8060 bytes per row and 8000 per (varchar, nvarchar) value?