如果主键总是排序,我如何以随机顺序将Guid存储为主键。一级键是按排序顺序存储,还是按SQL语句排序?
回答
好,不一定存储在磁盘上的排序顺序主键。但聚集索引是。在绝大多数情况下,主键是聚集索引。虽然这不一定能保证结果的排序,但结果通常是按照默认聚簇索引排序的。
我怎么能以随机顺序存储的GUID作为主键
的GUID不作出正是这种原因,良好的聚集索引。 SQL Server确实有一些东西叫做Sequential GUID来解决这个问题。生成的GUID不会连续,但它们将是连续的。它有一些注意事项,但:
创建一个GUID比以前这个功能指定的计算机上生成自Windows启动任何GUID更大。
如果系统重新启动,序列丢失。如果多个系统创建密钥,则序列会丢失。另外,还有一个问题是,我们仍然依靠SQL Server来生成密钥,这是使用GUID的一个重要原因。
一般来说,我不会使用GUID作为一个聚集索引建议。作为替代方案,可以使用普通的IDENTITY
键作为聚集索引并创建单独的GUID列(可能具有其自己的索引,甚至是唯一的约束,以确保应用程序不会尝试重新插入现有记录)。这个单独的列成为一种更具商业逻辑意义的“全局标识符”,而不是数据持久性实现意义上的那种。
用于覆盖连续指导的+1 – JiggsJedi 2014-10-03 19:19:52
聚集索引并不意味着数据必然按照光盘上的顺序排列。 [我的答案在这里更详细](http://stackoverflow.com/a/24470091/73226) – 2014-10-03 19:31:53
@MartinSmith:我误解了文档? http://msdn.microsoft.com/en-us/library/ms190457.aspx'“聚簇索引根据数据的键值对表或视图中的数据行进行排序和存储,这些列包含在索引定义中。每个表只能有一个聚簇索引,因为数据行本身可以按照一个顺序排序。“' – David 2014-10-03 19:33:49
否,该表数据并不总是存储在主键的顺序,但通常的主键有聚簇索引,以及该数据总是存储在聚簇索引的顺序。
如果您不想存储在主键的顺序中的数据,你应该使用它一个非聚集索引。
请注意,尽管您通常按照存储顺序获取数据,但除非您使用order by
子句,否则不保证该顺序。如果订单非常重要,您应该始终指定它应该是什么。
好吧。非聚集索引有什么缺点吗? 谢谢你的回答。 – 2014-10-05 09:37:42
@AKshayRaut:只有在索引中彼此相邻的记录不会在表中彼此相邻存储,因此提取一系列记录可能会稍微慢一点。但是,为guid建立聚簇索引会导致严重的碎片化,这会降低所有查询的性能,而不仅仅是一些特殊情况。 – Guffa 2014-10-05 12:18:41
好的。再次感谢。 – 2014-10-07 11:50:22
无主键并不总是按排序顺序存储。
聚集索引总是以排序顺序存储,这与流行的误解相反。
如果您选择随机GUID作为集群主键,那么您很可能很快就会得到高度分散的聚簇索引,其中物理和逻辑顺序在页面变满并且需要拆分时发生很大的分歧。
通常,大多数聚簇索引扫描通过遵循页面指针而不是分配(页码)顺序以逻辑(索引键)顺序发生。为了分配有序扫描,必须在读取未提交的隔离级别时运行,或者必须保持表锁。
然而,没有订单就没有保证结果顺序。
谢谢你的回答。 – 2014-10-05 09:41:25
下面是一篇很好的文章,讨论这个:http://blog.sqlauthority.com/2013/02/10/sql-server-primary-key-and-nonclustered-index-in-simple-words/ – DanK 2014-10-03 19:17:36