GUID在OLTP系统中作为键和群集没有问题(除非您的表上有很多索引受群集大小增加的影响)。实际上,它们比IDENTITY列具有更大的可伸缩性。
人们普遍认为GUID是SQL Server中的一个大问题-在很大程度上,这完全是错误的。实际上,GUID在具有大约8个以上内核的盒子上可以具有更大的可扩展性:
抱歉,您的开发人员是对的。在担心GUID之前,请先担心其他事情。
哦,最后:为什么首先要集群索引?如果您关心的是具有许多小索引的OLTP系统,那么最好使用堆。
现在,让我们考虑一下碎片化(GUID将引入哪种碎片化)对您的读取造成的影响。分段存在三个主要问题:
- 页面拆分成本磁盘I / O
- 半满页的内存效率不如整页
- 这会导致页面的存储顺序混乱,从而降低了顺序I / O的可能性
由于您在问题中关注的是可扩展性,因此我们可以将其定义为“添加更多硬件使系统运行更快”,这些问题最少。依次解决每个问题
广告1)如果您想扩展规模,那么您有能力购买I / O。即使是便宜的Samsung / Intel 512GB SSD(几美元/ GB)也可以让您获得超过100K的IOPS。您很快就不会在2插槽系统上使用它。如果您遇到这种情况,请再买一台,
广告2)如果您确实要删除表格,则无论如何您将拥有整整一半的页面。即使您不这样做,内存也很便宜,除了最大的OLTP系统外,其他所有内存都非常便宜-热门数据应该可以容纳在那里。当寻找规模时,寻求将更多数据打包到页面中是次优的。
广告3)由频繁分页,高度碎片化数据构成的表执行随机I / O的速度与顺序填充表的速度完全相同
关于联接,在OLTP之类的工作负载中可能会看到两种主要的联接类型:哈希和循环。让我们依次看一下:
散列连接:散列连接假定已扫描较小的表,通常会查找较大的表。小表很可能在内存中,因此在这里I / O并不是您所关心的。我们已经触及到这样一个事实,即零散索引中的搜寻成本与非零散索引中的搜寻成本相同
循环连接:将搜索外部表。相同成本
您可能还会进行很多错误的表扫描-但是GUID也不是您所关心的,正确的索引是。
现在,您可能会进行一些合法的范围扫描(尤其是在使用外键联接时),在这种情况下,与非分段数据相比,分段数据的“打包”程度较小。但是,让我们考虑一下,在索引良好的3NF数据中,您可能会看到哪些连接:
来自具有外键引用的表与其所引用表的主键的联接
另一种方式
广告1)在这种情况下,您要对主键进行一次查找-将n联接为1。是否存在碎片,相同成本(一次查找)
广告2)在这种情况下,您正在连接到同一键,但可能会检索到多行(范围搜索)。在这种情况下,连接为1到n。但是,您正在寻找的外部表正在寻找SAME键,该键与在非碎片索引中的碎片索引在同一页上的可能性相同。
考虑一下这些外键。即使您已经“完美地”按顺序放置了我们的主键-指向该键的任何内容仍将是非顺序的。
当然,您可能正在某个银行的某些SAN中的虚拟机上运行,这种虚拟机价格便宜且处理量大。然后,所有这些建议将丢失。但是,如果这就是您的世界,那么可伸缩性就不是您想要的-您正在寻找性能和高速度/成本-两者都是不同的。