sql-server – 表定义中列的顺序是否重要?
|
定义表时,按顺序排列逻辑组中的列和组本身是有帮助的.表中列的逻辑顺序向开发人员传达了意义,并且是良好风格的元素. 这很清楚. 然而,不清楚的是,表中列的逻辑顺序是否对它们在存储层的物理排序有任何影响,或者它是否具有人们可能关心的任何其他影响. 除了对风格的影响外,列顺序是否重要? 关于这一点有一个question on Stack Overflow,但它没有权威的答案. 解决方法表中列的逻辑顺序是否会对存储层的物理顺序产生任何影响?是.是否重要是一个我无法回答的不同问题. 与Paul Randal在anatomy of a record上经常链接的文章中描述的方式类似,让我们看一下带有DBCC IND的简单两列表: SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;
USE master;
GO
IF DATABASEPROPERTY (N'RowStructure','Version') > 0 DROP DATABASE RowStructure;
GO
CREATE DATABASE RowStructure;
GO
USE RowStructure;
GO
CREATE TABLE FixedLengthOrder
(
c1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,c2 CHAR(10) DEFAULT REPLICATE('A',10) NOT NULL,c3 CHAR(10) DEFAULT REPLICATE('B',10) NOT NULL
);
GO
INSERT FixedLengthOrder DEFAULT VALUES;
GO
DBCC IND ('RowStructure','FixedLengthOrder',1);
GO
上面的输出显示我们需要查看第89页: DBCC TRACEON (3604);
GO
DBCC PAGE ('RowStructure',1,89,3);
GO
在DBCC PAGE的输出中,我们看到c1在c2的’B’之前塞满了字符’A’: Memory Dump @0x000000000D25A060 0000000000000000: 10001c00 01000000 41414141 41414141 ?........AAAAAAAA 0000000000000010: 41414242 42424242 42424242 030000????AABBBBBBBBBB... 只是因为,让我们用十六进制编辑器打开RowStructure.mdf并确认’A’字符串在’B’字符串之前: 现在重复测试但是反转字符串的顺序,将’B’字符放在c1中,将’A’字符放在c2中: CREATE TABLE FixedLengthOrder
(
c1 INT IDENTITY(1,c2 CHAR(10) DEFAULT REPLICATE('B',c3 CHAR(10) DEFAULT REPLICATE('A',10) NOT NULL
);
GO
这次我们的DBCC PAGE输出不同,首先出现’B’字符串: Memory Dump @0x000000000FC2A060 0000000000000000: 10001c00 01000000 42424242 42424242 ?........BBBBBBBB 0000000000000010: 42424141 41414141 41414141 030000????BBAAAAAAAAAA... 再次,只是为了咯咯笑,让我们检查数据文件的十六进制转储: 正如Anatomy of a Record所解释的那样,记录的固定长度和可变长度列存储在不同的块中.逻辑交错固定和可变列类型与物理记录无关.但是,在每个块中,列的顺序会映射到数据文件中的字节顺序. CREATE TABLE FixedAndVariableColumns
(
c1 INT IDENTITY(1,c3 VARCHAR(10) DEFAULT REPLICATE('B',c4 CHAR(10) DEFAULT REPLICATE('C',c5 VARCHAR(10) DEFAULT REPLICATE('D',c6 CHAR(10) DEFAULT REPLICATE('E',10) NOT NULL
);
GO
Memory Dump @0x000000000E07C060
0000000000000000: 30002600 01000000 41414141 41414141 ?0.&.....AAAAAAAA
0000000000000010: 41414343 43434343 43434343 45454545 ?AACCCCCCCCCCEEEE
0000000000000020: 45454545 45450600 00020039 00430042 ?EEEEEE.....9.C.B
0000000000000030: 42424242 42424242 42444444 44444444 ?BBBBBBBBBDDDDDDD
0000000000000040: 444444???????????????????????????????DDD
也可以看看: Column order doesn’t matter… generally,but – IT DEPENDS! (编辑:百客网 - 域百科网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – 从备份失败的SQL Server 2005还原
- sql-server – 层次结构中子级别总和的总和
- sql-server – 哪些表设计更适合性能?
- sql-server – 是否可以强制优化器消除此分区视图中不相关的
- sql-server – SQL Server镜像是否可靠(高可用性)?
- 微软产品遇空前信任危机 逾66%用户表示不满
- sql-server-2008 – 是否可以在SQL Server 2008中选择特定的
- sql-server-2008 – 如何将值从动态SQL存储过程返回到实体框
- 如何通过组策略将域用户设置为本地管理员账户
- 要选就选最好的——三星光存储国庆导购指南

