2008-10-15 100 views
6

我需要索引MS SQL Server 2005中我的表上的varchar字段,但是我不清楚該怎麼做。如果我嘗試在字段上添加一個非聚集索引,它表示「mytable」表中的「列'xxxx'是一種無效的索引中的鍵列」MS SQL Server 2005上的索引varchar

我的表格有一個自動增加的int ID,它被設置爲表上的主鍵。如果我將此屬性設置爲索引,然後將我的varchar列作爲「包含列」添加,則索引會通過。但我不確定這就是我想要的 - 我希望能夠根據varchar字段單獨搜索表,並且我對索引的理解是必須提供所有索引元素才能在查詢中實際看到加速,但我不想包含int ID(因爲我不知道這是什麼,在給定的查詢時)。

我試圖做錯誤嗎?作爲包含列的ID + my varchar會完成我正在尋找的內容嗎?

回答

10

是你的varchar(max)?我認爲這些不允許在索引中使用。

否則,請發佈您的CREATE TABLE聲明,通常在索引中添加varchar沒有任何問題。

2

不,ID + varchar列不起作用。這對於查詢ID的查詢非常有用,只需選擇ID或/和varchar列 - 那麼您將擁有一個覆蓋索引,並且只能通過查看索引來檢索所有內容。

我猜你的ID列上有一個聚簇索引,因爲這是主鍵。然後你需要在varchar列上創建一個非聚集索引 - 這應該是可能的。非聚集索引也會自動包含ID。

另外請記住,該索引只適用於像WHERE VarcharColumn ='xyz'和WHERE VarcharColumn LIKE'xyz%'這樣的查詢。

它不會幫助LIKE'%xyz%'和'%xyz'查詢。

0

您不需要將主鍵中的varchar字段包含在索引中。要創建索引,只需在Management Studio中修改表,請單擊管理索引和鍵按鈕,然後單擊添加以添加新索引。然後選擇VARCHAR字段。應該沒有問題。

1

默認情況下,將列設置爲主鍵會創建聚集索引,因此您不必創建另一個INT + VARCHAR索引。

什麼你要找的是隻有你的VARCHAR索引 - 無+ INT,因爲你的主鍵隱含 - 畢竟SQL服務器應該能夠執行索引查找時找到實際行。雖然有一個限制,但我相信索引列的整體大小應爲< 900字節(至少在SQL Server 2000中是這樣)。你的VARCHAR有多長?

4

我假設你是一個VARCHAR(MAX)列,正如錯誤所說,它是一個索引的invalida數據類型。建議:創建一個計算列,即VARCHAR(MAX)列的哈希值(例如,使用HashBytes函數),然後僅在計算列上創建索引。然後,在SQL DML的搜索條件(例如WHERE子句)中,您可以在表中的相應列上使用VARCHAR(MAX)搜索值本身加上表示您的VARCHAR(MAX)搜索值的散列值。將搜索值的散列值封裝在'助手'存儲過程中可能是一個好主意。

+0

+1用於提及HashBytes功能 – CSharper 2011-07-12 22:42:59