[英]SQL Server 2008 Table Structure with Guid Performance Considerations
关于是否使用Guid,我现在实际上处于两难境地。
我有一个非事务处理表,称为Posts,bigint为PK。
据我了解,使用Guid作为PK会妨碍查询性能。 但是,为了使查询字符串真正唯一,我决定使用Guid default value newid()
添加一列specialID
。 这将使我所有的查询字符串真正唯一,因为我要做的就是执行以下查询:
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;
但是,我的同事不同意,说这仍然会妨碍查询性能。 为什么? 我应该继续这样吗? 真正唯一的查询字符串不是必需的,但更可取。 如果确实会影响性能,我们如何才能拥有真正唯一的查询字符串?
它不会显着妨碍SELECT查询,尤其是如果您正确索引了列。 它可能会影响插入,但是如果GUID不在聚集索引中,则问题就不那么严重了。 它还会影响存储要求,具体取决于要存储的数据量(因为(显然)要大得多)。
在此处进行详细讨论: http : //www.sql-server-performance.com/2005/guid-performance/尽管那是针对2005年的,但我相信所有观点仍然有效。
**编辑:简单的索引示例**“覆盖索引”仅表示您具有包含所涉及列的索引。 聚簇索引意味着实际上按照索引说的顺序存储记录,非聚簇索引意味着索引拥有指向存储位置的指针。 考虑一下字典与书本索引之间的区别。 字典按单词顺序排序,并按该顺序(聚集)存储其所有数据,而索引按单词顺序排序,但是具有指向不相同顺序(非聚集)的页码的指针。
因此,要为您的列创建索引,您需要执行以下操作:
CREATE INDEX idx_posts_specialId
ON Posts (specialID);
GO
默认为非群集,但是如果您希望明确,可以添加“ nonclustered”关键字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.