2014-10-03 81 views

回答

0

好,不一定存储在磁盘上的排序顺序主键。但聚集索引是。在绝大多数情况下,主键是聚集索引。虽然这不一定能保证结果的排序,但结果通常是按照默认聚簇索引排序的。

我怎么能以随机顺序存储的GUID作为主键

的GUID不作出正是这种原因,良好的聚集索引。 SQL Server确实有一些东西叫做Sequential GUID来解决这个问题。生成的GUID不会连续,但它们将是连续的。它有一些注意事项,但:

创建一个GUID比以前这个功能指定的计算机上生成自Windows启动任何GUID更大。

如果系统重新启动,序列丢失。如果多个系统创建密钥,则序列会丢失。另外,还有一个问题是,我们仍然依靠SQL Server来生成密钥,这是使用GUID的一个重要原因。

一般来说,我不会使用GUID作为一个聚集索引建议。作为替代方案,可以使用普通的IDENTITY键作为聚集索引并创建单独的GUID列(可能具有其自己的索引,甚至是唯一的约束,以确保应用程序不会尝试重新插入现有记录)。这个单独的列成为一种更具商业逻辑意义的“全局标识符”,而不是数据持久性实现意义上的那种。

+0

用于覆盖连续指导的+1 – JiggsJedi 2014-10-03 19:19:52

+2

聚集索引并不意味着数据必然按照光盘上的顺序排列。 [我的答案在这里更详细](http://stackoverflow.com/a/24470091/73226) – 2014-10-03 19:31:53

+0

@MartinSmith:我误解了文档? http://msdn.microsoft.com/en-us/library/ms190457.aspx'“聚簇索引根据数据的键值对表或视图中的数据行进行排序和存储,这些列包含在索引定义中。每个表只能有一个聚簇索引,因为数据行本身可以按照一个顺序排序。“' – David 2014-10-03 19:33:49

2

否,该表数据并不总是存储在主键的顺序,但通常的主键有聚簇索引,以及该数据总是存储在聚簇索引的顺序。

如果您不想存储在主键的顺序中的数据,你应该使用它一个非聚集索引。

请注意,尽管您通常按照存储顺序获取数据,但除非您使用order by子句,否则不保证该顺序。如果订单非常重要,您应该始终指定它应该是什么。

+0

好吧。非聚集索引有什么缺点吗? 谢谢你的回答。 – 2014-10-05 09:37:42

+0

@AKshayRaut:只有在索引中彼此相邻的记录不会在表中彼此相邻存储,因此提取一系列记录可能会稍微慢一点。但是,为guid建立聚簇索引会导致严重的碎片化,这会降低所有查询的性能,而不仅仅是一些特殊情况。 – Guffa 2014-10-05 12:18:41

+0

好的。再次感谢。 – 2014-10-07 11:50:22

1

无主键并不总是按排序顺序存储。

聚集索引总是以排序顺序存储,这与流行的误解相反。

如果您选择随机GUID作为集群主键,那么您很可能很快就会得到高度分散的聚簇索引,其中物理和逻辑顺序在页面变满并且需要拆分时发生很大的分歧。

通常,大多数聚簇索引扫描通过遵循页面指针而不是分配(页码)顺序以逻辑(索引键)顺序发生。为了分配有序扫描,必须在读取未提交的隔离级别时运行,或者必须保持表锁。

然而,没有订单就没有保证结果顺序。

+0

谢谢你的回答。 – 2014-10-05 09:41:25