Sql server 带有varchar(255)主键的表会有什么影响吗?

Sql server 带有varchar(255)主键的表会有什么影响吗?,sql-server,database-design,sql-server-2008-r2,sqldatatypes,Sql Server,Database Design,Sql Server 2008 R2,Sqldatatypes,我知道这不是一个好主意,但我想再次检查一下,这不会让服务器崩溃 CREATE TABLE [dbo].[Items]( [Id] [nvarchar](255) NOT NULL PRIMARY KEY, [Value] [nvarchar](max) NOT NULL, ) 了解类似这样的键与[int]键的比较细节是很有意思的,但只要确认这不会损害任何东西就足够了。不,您几乎可以在任何SQL类型上创建主键。如果SQL会使服务器崩溃,它将不允许这样做。正如您已经说过的,这对服务

我知道这不是一个好主意,但我想再次检查一下,这不会让服务器崩溃

CREATE TABLE [dbo].[Items](
    [Id] [nvarchar](255) NOT NULL PRIMARY KEY,
    [Value] [nvarchar](max) NOT NULL,
)

了解类似这样的键与[int]键的比较细节是很有意思的,但只要确认这不会损害任何东西就足够了。

不,您几乎可以在任何SQL类型上创建主键。如果SQL会使服务器崩溃,它将不允许这样做。正如您已经说过的,这对服务器内存或性能都不是很好


事实上,这是这个问题的性能部分的关键。

这会带来性能开销,但不会“使服务器崩溃”

可以使用VARCHAR(#)作为主键吗

是的。
从中,对于该列,
VARCHAR(255)
每行将占用257(255+2)字节(取决于实际数据的长度)

了解类似这样的键与
INT
键的比较细节会很有趣

INT
需要4个字节。根据您的数据,有占用较少空间的数字数据类型:

  • SMALLINT
    :2字节
  • TINYINT
    :1字节
字节数越小,访问列中数据的速度就越快。这包括连接。此外,数据库(和备份)将更小


我非常怀疑是否需要使用如此大的
VARCHAR
作为主键--guid甚至没有那么长。

我使用它是为了方便快速完成一些事情-我知道从长远来看,这是一个糟糕的设计选择-感谢您的建议…因为您的主键也是该表上的集群键,有一个
VARCHAR(255)
PK非常糟糕,原因有两个:(1)对于
INT
,它太大(最多255个字节加上开销)而不是4个字节,其次,因为它是一个可变长度的列,这再次增加了索引导航结构的开销。如果这是一个包含多个非聚集索引的表,我强烈建议您重新考虑主键……Marc提到了不使用Id作为聚集索引的原因。不管他怎么说,这并不是它不成为主键的理由。主键不必群集。