2011-09-09 50 views
1

我有以下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條記錄。如果我在此字段上創建了索引,它是否有助於提高性能?

回答

1

您可以將任何可索引和唯一的主鍵。一個varchar(50)是沒有問題的。只要每個記錄在該列中具有唯一值,您就可以在事實之後添加定義主鍵。 YOu將不被允許「初級化」不是唯一的列。

至於索引,如果它只在一天中運行一次的單個刪除查詢中被引用,那麼請不要編入索引。通過桌面上的每一次插入/更新來維護索引的開銷將不值得您在每日一次刪除時節省的微小時間。另一方面,如果該字段在其他查詢中的where/join子句中經常使用,那麼請繼續並添加一個索引 - 您肯定會提高性能。

0

基本上,從技術上講,您可以使主鍵的最大大小小於900字節的任何列,例如,您無法使主鍵爲NVARCHAR(2000),但nvarchar(50)有效。

主鍵的要求是:

  • 必須是唯一的。如果這些要求都滿足
  • 不能爲NULL

- 你是好去。

需要記住的一件事是:您的主鍵是 - 默認情況下 - 還有您的集羣密鑰,這是表格內容物理排序(稍微簡化)的關鍵。因此,該集羣密鑰類似於表中數據行的地址指針,它也將包含在您的表中的每個非聚簇索引中。

如果你有一個沒有任何或只有一個非聚集索引的表 - 不用擔心。但是,如果你的表有很多非聚集索引(比如Customer表可能有四個,五個索引甚至更多),那麼擁有如此寬的可變寬度集羣鍵(100字節)並不理想。在這種情況下,最好使用類似INT IDENTITY的代理鍵作爲替代鍵,並將主鍵/聚集索引放在該列上。它將爲您節省很多磁盤空間的,並使您的表格表現更好。

在Kimberly Tripp的博客文章Ever-increasing clustering key - the Clustered Index Debate..........again! - 高度教育閱讀更多關於什麼使得一個好的集羣密鑰(在一張繁忙的大桌子上)。