想象一下,我有一张这样的表:
CREATE TABLE [dbo].[Things](
[Id] [uniqueidentifier] NOT NULL DEFAULT (newId()),
[ThingName] [nvarchar](100) NOT NULL,
[ThingCode] [int] NOT NULL
) ON [PRIMARY]
如果我将 ID 列设为标识,那么支持它会更难。 是否有任何性能因素或任何让我改变主意的事情?
谢谢,
答案 0 :(得分:6)
性能考虑:是的。 uniqueidentifier(GUID)列可以作为主键,但不能作为聚簇索引。在将在范围搜索中使用的列上创建聚簇索引,并在GUID列上创建非聚集索引。
uniqueidentifier(GUID)列使用16个字节,因此使用的存储空间更高(数据库页面上的行数更少),并且数据传输所消耗的带宽更高。
GUID作为主键(在int
或bigint
上)的主要用途是能够在中间应用程序层中分配这些内容而无需往返数据库,同时仍然避免冲突。
如果你需要的是一个大于int的键范围(4bytes,2 31 - 1)那么使用bigint
(8字节),它支持2 63 - 1行(对于大多数应用来说已经足够了)
答案 1 :(得分:2)
uniqueidentifier是大字段,因此您将通过网络存储和移动更多数据 - 这是性能考虑因素之一。
此外,newid()
(据我所知)将不生成顺序标识符,如果您决定将该列用作聚簇索引,则会导致索引碎片,这是一个主要的性能问题
该类型的主要用途是在断开连接的场景中,您需要生成密钥并避免在重新连接和添加新数据时发生冲突。
答案 2 :(得分:1)
联接在整数上更快,通过网络发送的信息更少,所以是的,有性能考虑因素。但是根据系统的大小,这可能并不重要。当您不必使用如此大的标识符时,通常也更容易进行即席查询。如果id是暴露给用户的内容(person id通常在业务应用程序中,因为名称不是唯一的),那么用户肯定更喜欢查看和使用整数。如果你正在进行复制,GUIDS是非常必要的。真正的问题是为什么要使用GUID。答案就是真正告诉你的是你是否可以用身份替代。
您应该使用NEWSEQUENTIALID()而不是newID()。如果您使用它,也不应该让SQL Server将聚簇索引放在newId()上,否则会导致性能问题。它是通过对主键(我认为这将是)的deafult来做到的,但如果你使用newid(),你可以而且应该改变它。