2012-07-12 90 views
0

我正在使用SQLExpress設計數據庫。 我有一個有三列的表格。表格如下所示。添加索引後更新表格

CREATE TABLE [dbo].[dummy](
[id] [int] IDENTITY(1,1) NOT NULL, 
[someLongString] [text] NOT NULL, 
[someLongText_Hash] [binary](20) NOT NULL, 
CONSTRAINT [PK_dummy] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

我已經在此表中有一些數據。無論何時我想添加一個新行,我首先在someLongString上計算一個散列並查詢該表以查看是否存在具有該散列的行。隨着表大小的增長,這個查詢會話的時間會更長,因此我計劃通過someLongText_Hash列索引它。

可以請一些建議如何在SQL Server Management Studio中執行此操作。此外,添加此索引後,如何索引此表中的現有行?

+1

爲什麼你使用'TEXT'作進一步說明,請參見here?您應該使用'VARCHAR(MAX)' – 2012-07-12 00:48:41

+0

@AaronBertrand,如何使用Varchar(MAX)比使用Text更好? – Venom 2012-07-12 17:18:47

+0

'TEXT'已棄用。 http://msdn.microsoft.com/en-us/library/ms143729(v=sql.90).aspx – 2012-07-12 17:20:01

回答

1

爲什麼你不能只設置'someLongString'字段是唯一的?那樣你不需要保留一個散列和一個額外的主鍵?

您可以嘗試使用CHECKSUM。

CREATE TABLE [dbo].[dummy](
[id] [int] IDENTITY(1,1) NOT NULL, 
[someLongString] [text] NOT NULL, 
[someLongText_CheckSum] NOT NULL, 
CONSTRAINT [UC_someLongText_CheckSum] UNIQUE (someLongText_CheckSum), 
CONSTRAINT [PK_dummy] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

+1

'someLongString'是'TEXT'。您不能使'TEXT'唯一 - 唯一密鑰的最大長度爲900個字節。 – 2012-07-12 00:49:09

+0

我將'someLongText_Hash'字段設置爲'UNIQUE',並且工作正常。不過,我後來根據這個字段查詢罷了,所以我也想索引它。但是我無法在SQL Server Management中看到這個選項。 – Venom 2012-07-12 17:54:47