【发布时间】:2011-11-17 03:16:47
【问题描述】:
我现在实际上在是否使用 Guid 方面处于两难境地。
我有一个名为 Posts 的非事务性表,其 PK 为 bigint。
据我了解,使用 Guid 作为 PK 会影响查询性能。但是,为了使查询字符串真正唯一,我决定添加一个名为specialID 和Guid default value newid() 的列。这将使我的所有查询字符串真正独一无二,因为我需要做的就是执行以下查询:
SELECT *
FROM Posts p
WHERE p.specialID = '[query-string]'; // For single record retrieval
至于 Joins,bigint PK 将发挥如下作用:
SELECT p.id, p.specialID, ul.name as Writer
FROM Posts p
JOIN Users ul ON ul.id = p.writer;
但是,我的同事不同意,并说它仍然会影响查询性能。为什么?我应该继续这样吗?真正唯一的查询字符串不是必需的,但会是首选。如果它确实会影响性能,我们如何才能拥有一个真正唯一的查询字符串?
【问题讨论】:
-
数据类型越窄,性能越好。 INT 而不是 BIGINT 等。你有数据来证明 BIGINT 的需要吗?我需要进一步了解为什么需要使用 GUID,因为如果设计需要,性能并不重要。
-
你好 OMG Ponies,[编辑,似乎 Enter 只会提交] 我使用 bigint 而不是 int,因为我预计记录会随着时间的推移而增长,这将是巨大的。 Guid 的原因就像陈述的那样,我希望它是一个真正唯一的查询字符串。例如,如果我要访问 id 为 100 的帖子,而不是 Post.aspx?id=100,我可以使用 Post.aspx?id=[Guid]
-
在获得数据之前,您可以使用 INT。 “真正唯一的查询字符串” - 您的示例是主键,当 IDENTITY 以一小部分开销提供相同功能时,不需要使用 GUID。使用 GUID 作为 GET 参数也比数值更可能是 SQL 注入攻击向量。更长的时间,它也是 URL 长度的一个问题。
-
使用 GUID 作为 SQL Server 中的 集群键(数据物理排序的键)是一个非常糟糕的选择,因为存在碎片和其他性能问题。否则,拥有一个 GUID 列并没有那么糟糕。所以我会说继续前进,在其上放置一个索引(使其成为唯一索引)并密切关注性能 - 但我预计不会有任何重大/可衡量的负面影响
-
至于“用尽
INT标识值”:如果您使用从1开始的INT IDENTITY,并且您每秒、每天、全年插入一行,则需要66.5 年,距离你达到 20 亿的上限 ....
标签: sql sql-server sql-server-2008 primary-key guid