27,579
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE TEST(ID INT IDENTITY(1,1) PRIMARY KEY,A VARCHAR(50))
INSERT INTO TEST(A) VALUES('A'),('B'),('C'),('D')
/*查看数据的物理分布*/
DBCC IND('master','test',-1)
/*
PageFID PagePID IAMFID IAMPID ObjectID IndexID PartitionNumber PartitionID iam_chain_type PageType IndexLevel NextPageFID NextPagePID PrevPageFID PrevPagePID
------- ----------- ------ ----------- ----------- ----------- --------------- -------------------- -------------------- -------- ---------- ----------- ----------- ----------- -----------
1 196 NULL NULL 1899153811 1 1 72057594040811520 In-row data 10 NULL 0 0 0 0
1 193 1 196 1899153811 1 1 72057594040811520 In-row data 1 0 0 0 0 0
*/
/*查看具体页的数据内容*/
DBCC TRACEON(3604)
DBCC PAGE('master',1,193,3)
/*
在page内,会通过slot来维护数据的顺序性,下面是从dbcc page的结果提取出的slot的情况
Slot 0 Offset 0x60 Length 30
Slot 1 Offset 0x7e Length 30
Slot 2 Offset 0x9c Length 30
Slot 3 Offset 0xba Length 30
可以看到,此时四条数据现在page内的物理排序是顺序的(根据offset值判断)
*/
/*
对数据进行更新。
*/
UPDATE TEST SET A='DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD'
WHERE ID=1
DBCC TRACEON(3604)
DBCC PAGE('master',1,193,3)
/*
slot 和page的分布如下
可以看到slot 0 这条记录在页中的位置已经比后续记录靠后了,说明在物理上的排序已经是不准确的。
但仍维护着逻辑上的四条记录的排序
*/
/*
Slot 0 Offset 0xd8 Length 74
Slot 1 Offset 0x7e Length 30
Slot 2 Offset 0x9c Length 30
Slot 3 Offset 0xba Length 30
*/
select * from tb where....
可能选择index seak或者index scanselect * from tb
取出的数据是无需的,需要排序select * from tb order by FieldA