当前位置: 代码迷 >> Sql Server >> GUID做主键,且默认为聚集索引,这个主键再在数据库中是如何存放的
  详细解决方案

GUID做主键,且默认为聚集索引,这个主键再在数据库中是如何存放的

热度:79   发布时间:2016-04-27 11:46:37.0
GUID做主键,且默认为聚集索引,这个主键再在数据库中是怎么存放的?
看见一个数据库中时GUID做主键,聚集索引默认为主键(这个GUID)

但是这个GUID是自动生成的,应该来说是没有规律的,而聚集索引是顺序存放的

GUID做主键,且为聚集索引,的确是按GUID“大小”顺序存放的

我自己做了下测试,却是是这样的,如下,

但事实上我看到的那个数据库中(GUID做主键,且为聚集索引),数据的默认存放并不是按GUID的大小存放的,而是随机存放的,就是默认的存放顺序GUID第一个字符顺序无关。但是我select * from tablename order by ID的时候,竟然还是默认那个顺序(不加order by一样的顺序),到底是怎么回事呢?

还有一个问题就是,GUID做主键这样会不会引起叶分裂呢(page split)

SQL code
declare @i intset @i=0while @i<100begininsert into Test values (NEWID(),'aaaa')set @[email protected]+1end--结果如下02CED1BC-76A3-4604-9853-564539A62A96    aaaa0341510F-B599-4084-96CB-74DFF5021429    aaaa0668ABCB-120A-465B-B8E1-6D1FCF9599E4    aaaa078641B6-7598-4632-B97F-1ABCF6508F3A    aaaa0ACD20ED-57CF-4A6D-BEA3-883E9E4C930D    aaaa0EFFD408-FA6D-4C62-BA43-18F2AE092845    aaaa0F51747F-6BDE-4F55-90C7-B7AFAD90C8BB    aaaa10386C69-50A4-4A41-8D05-81EF9BAFAA98    aaaa113FE204-494A-4303-B6DE-B5B381C94B29    aaaa12384E03-8383-4C0E-8FC8-8E5FD65074BB    aaaa1390D786-C07B-49A0-BAC2-9D17C012BE76    aaaa14B42532-5CCD-4397-837D-86421FC36165    aaaa15BDD842-95D5-43BE-A943-15E4A029F5EF    aaaa16178FBD-6698-4398-B15C-CA1F793A6EB0    aaaa1800EC09-8B19-443E-B5EB-53500B732123    aaaa1C96B362-7F4D-49EB-9AED-01BA97A5BA72    aaaa1EE53FF0-E6DF-4B57-8B1F-432472AB0C04    aaaa20921CC3-4EB3-40DF-A5F5-EE9FAA72461F    aaaa22215930-0810-463A-83EF-7152D6691621    aaaa26E5B5BB-6E55-47AF-AB70-E95ED66B4BDB    aaaa27B0E82F-DFEF-4353-9150-6BA96AEAFC24    aaaa28C8647F-06D7-487F-90AA-920FBFB7ED05    aaaa2CE36174-9B1E-472F-BE8D-D5CF160F1F31    aaaa2FDD119C-6E96-422D-8A39-781449552231    aaaa30490DCB-69B3-461C-A30D-32DCE93B6CF9    aaaa33213377-5254-45DF-8FB4-6B5FF075CACE    aaaa353BAF1F-1873-4F04-AFFE-1582094F5DB4    aaaa3747C710-AE43-4842-A649-70FB4938C7C3    aaaa393E766A-26E9-4BFE-A935-E67541B886DD    aaaa396D367B-9EB5-44D5-9F86-66239C198598    aaaa3F0E76FE-6655-489D-BA5E-ABA70B34EF1F    aaaa40169B21-8B07-4718-B30A-46F8608534B3    aaaa420FB73F-C880-4055-825C-1F513B912AB6    aaaa469DFD96-6D33-4520-8B5F-093A02BD1176    aaaa47CF7608-B414-49D3-9EEA-8169DB6F4BAE    aaaa483428EE-153D-4BBB-8FC2-B2641C4D7940    aaaa4C65A723-BBC4-4E59-8235-AB6B7FEE7D9B    aaaa4D85821D-C6A5-4D4C-9DF0-4A2630951133    aaaa58B76DC2-0703-4C95-AFC1-7BD95D70AB4A    aaaa5A159F90-77DC-444A-AF84-9C85BD0535B8    aaaa61A14EAF-6A60-41CF-B1AC-09EE12FD1181    aaaa62562688-4E7D-4611-8BBA-6FAE7709E5E6    aaaa62D9A0A5-A987-4A3C-9651-E54F3300856B    aaaa69B4E5A5-019C-45A4-994D-4A3FAAA13817    aaaa………………F8291561-16F1-490D-B51B-4BEE0436E0E7    aaaaF8EED731-34A5-439D-A48F-9730CDC2EE49    aaaaFB5ED5D8-3AEC-4D06-9984-AAD7BBC918D8    aaaaFE313DE3-CEBB-49F7-83D6-7A8A7CDB6487    aaaa


------解决方案--------------------
1、GUID是有大小的,聚集索引也是按这个大小排序的,只是你把他转成字符显示(做不到不转能显示)的时候,词虚拟看不出来而已
2、GUID做聚集索引(不一定主键)会引起叶分裂,所以说这个设置并不合理,数据量大很危险,建议改用一个时间字段或者其他增长的字段
------解决方案--------------------
好像有改进版的guid,有顺序了
sql2008才有

——请使用过的介绍一下