我有以下sql server 2008数据库表:
CREATE TABLE [dbo].[cache](
[cache_key] [nvarchar](50) NOT NULL,
[cache_data] [nvarchar](max) NOT NULL,
[expiry_date] [datetime] NOT NULL) ON [PRIMARY]
我想为它添加一个主键,即。使cache_key列成为主键。此列包含唯一字符串。我的问题是,将nvarchar 50列作为主键是否有任何影响?是否可以将主键添加到包含数据的此列,即使cache_key数据是唯一的?
我还有另一个每天运行的脚本,它根据expiry_date列从表中删除数据。这可能意味着根据与此字段的比较删除最多5000条记录。如果我在这个字段上创建索引会对性能有帮助吗?
答案 0 :(得分:1)
您可以使用可索引且唯一的任何内容制作主键。 varchar(50)没问题。只要每个记录在该列中具有唯一值,您就可以在事后添加定义主键。你不会被允许“初级化”一个不唯一的列。
对于索引,如果它只在每天运行一次的单个删除查询中被引用,那么就不要打扰它了。通过表上的每次插入/更新来维护索引的开销将不值得您在每天一次删除时获得的微观时间节省。另一方面,如果该字段经常在其他查询中的where / join子句中使用,那么继续并加上索引 - 您肯定会提高性能。
答案 1 :(得分:0)
基本上,从技术上讲,您可以在主键上创建任何小于900字节的列,例如:您无法将NVARCHAR(2000)
作为主键,但nvarchar(50)
可以使用。
主键的要求是:
如果满足这些要求 - 你很高兴。
要记住的一件事是:您的主键是 - 默认情况下 - 也是您的群集键,表格内容按物理顺序排列的键(略微简化)。因此,该聚类键类似于表中数据行的地址或指针,它将包含在您拥有的每个非聚集索引中你的桌子也是。
如果你的表没有任何或只有一个非聚集索引 - 不用担心。但是如果你的表有很多非聚集索引(比如Customer
表可能有四个,五个索引甚至更多),那么可变宽度这么宽的聚类键(100字节)并不理想。在这种情况下,最好使用INT IDENTITY
之类的东西作为代理键,并将主键/聚簇索引放在该列上。它将为您节省很多的磁盘空间,让您的桌面表现更好。
在Kimberly Tripp的博文Ever-increasing clustering key - the Clustered Index Debate..........again!中阅读更多关于什么是一个好的群集密钥(在繁忙的大桌子上) - 具有高度教育性!