对 uniqueidentifier 列具有唯一约束的性能影响?

Performance impact of having a unique constraint on uniqueidentifier column?

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

在 SQL 服务器上,创建唯一约束就是 the same as 创建唯一索引。

代码示例

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

我使用 int 列作为聚簇索引,并将事件 ID 作为唯一约束保留在 table 中。这是示例:

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
    )    
)

问题

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

任何索引都有一些写入操作的开销。索引也有读取的价值。

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

您可以使用小于 100 的填充来减少碎片。

默认 newsequentialid 也会减少碎片。

任何索引、主键或唯一约束都会影响性能。权衡是更高的检索性能与略微且通常可以忽略不计的写入性能。

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

使用 UNIQUEIDENTIFIER,您可以 运行 从称为页面拆分的东西中获得性能命中。一个页面是 8K,8K 可以容纳多少记录。如果您需要添加一条位于整页中间的新记录,则现有页面必须创建两个新页面以容纳每个页面中原始数据的一半加上您的新记录指针。这在聚集索引中尤其痛苦,因为聚集索引会影响记录的物理存储。

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

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

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

这个link有点老了,但它基本上回答了你的问题..."From a performance standpoint, UNIQUE constraints and unique indexes are effectively the same to the query optimizer and you will not see any performance benefit to using one vs the other."