对唯一标识符列具有唯一约束的性能影响?



在唯一标识符(即真正的随机标识符)列上创建非聚集索引会导致索引碎片化,从而影响性能。

在 SQL Server 上,创建唯一约束与创建唯一索引相同。

代码示例

在此方案中,我有来自客户端应用程序的事件。在某些情况下,这些客户端应用程序可以多次发送相同的事件,并且我要求不要保存两次保存事件。

我对聚集索引使用int列,并将表中事件的 ID 保留为唯一的约束。下面是示例:

CREATE TABLE EventTable
(
[Id] [int] IDENTITY(1,1),
[EventId] [uniqueidentifier] NOT NULL,
CONSTRAINT UC_EventId UNIQUE (EventId),
CONSTRAINT [PK_TableId] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)    
)

问题

对唯一标识符(即唯一标识符的基础索引)的唯一约束是否会影响表的性能?

任何索引、主键或唯一约束都会对性能造成一定影响。 代价是更高的检索性能与稍微可以忽略不计的写入性能。

要编制索引的键或值的大小也会影响性能。 UNIQUEIDENTIFIER 是 128 位值,BIGINT 是 64 位,INT 是 32 位。 为 VARCHAR 或 CHAR 字段编制索引将反映该数据类型的大小。

使用唯一标识符,您可能会遇到称为页面拆分的性能影响。 一个页面是 8K,可以容纳 8K 中可以容纳的任意数量的记录。 如果需要添加位于整页中间的新记录,则现有页面必须创建两个新页面,以保存每个页面中一半的原始数据以及新记录指针。 这在聚集索引中尤其痛苦,因为聚集索引会影响记录的物理存储。

页面拆分是使用 UNIQUEIDENTIFIER 数据类型的不可避免的部分,将它们放在集群键中会加剧这种情况。 我建议您不要对此类数据类型使用集群键。

UNIQUEIDENTIFIER 数据类型(除了唯一性)的好处是它们的随机性可以防止数据页中的热点。

在您的示例中,您同时具有 INT 标识字段和具有 NewID() 默认值的唯一标识符。 如果这不仅仅是一个例子,我应该很好奇为什么你两者都有?

这个链接有点旧,但它基本上回答了你的问题......"从性能的角度来看,UNIQUE 约束和唯一索引实际上与查询优化器相同,并且您不会看到使用其中一个与另一个的任何性能优势。

任何索引都有一些写入操作开销。 索引还具有读取值。

如果需要唯一值,则 [EventId] 的搜索速度应远远超过维护和索引的成本。 如果没有UNIQUE数据库不会强制实施唯一性,搜索现有值将是表扫描。

您可以通过小于 100 的填充来减少碎片。

新闻序列的违约也将减少碎片化。

最新更新