繁体   English   中英

具有指导性能注意事项的SQL Server 2008表结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM