2011-10-18 173 views
6

我試圖把一個索引放在一個將保存URL的列上。由於URL的最大長度超過2000個字符,我將數據類型設置爲NVARCHAR(3000)。當我這樣做時,我得到了錯誤The total size of an index or primary key cannot exceed 900 bytes。由於我可能需要通過URL搜索記錄,因此我需要在我的URL列上使用索引。有沒有辦法解決這個限制?SQL Server:索引或主鍵的總大小不能超過900個字節

+0

這對我來說確實聽起來不是很有效。事實上,這聽起來像是數據庫引擎管理的完整噩夢。你是否確定你*需要通過URL進行搜索,並且這種搜索會變得緩慢?文本搜索可以很快就能知道。也有可能你把URL分成幾個比特,只索引那些比特中的一個(最不同的那個比特),然後把索引部分和整個url聯繫起來。總之,這裏有很多可能的策略。 – Robinson

回答

10

您可以爲URL的校驗和創建一個計算列,然後在查詢中使用校驗和。校驗和不是唯一的,但它會迅速縮小可能的匹配數量。

首先,計算列添加到您的表,這樣的:

現在
Alter Table YourTableName Add URL_HASH As CheckSum(URL) 

指標列如下:

Create Index idx_YourTableName_URL_HASH On YourTableName(URL_HASH) 

現在,您可以編寫一個查詢,會做一個索引查找找到你正在尋找的行:

Select URL 
From YourTableName 
Where URL_HASH = CheckSum(N'google.com') 
     And URL = 'google.com' 

這種方法應該很好地進行精確匹配ES。如果你想部分匹配,你最好使用全文搜索功能。

+0

謝謝我們決定實施這個。 – Luke101

+0

嗨G馬斯特羅斯。感謝您的回答。我有擁有大量數據的Varbinary專欄。此列可以爲空,並且我有查詢,查找該列不爲空的記錄。在這種情況下,您的校驗和方法也很有用。我檢查了可空列的校驗和是2147483647.雖然它可以工作,但在查詢中硬編碼這個數字似乎很奇怪。當我們遷移到其他版本的SqlServer時,這個數字是否會一樣?我曾經在C#中使用GetHashCode方法在腳下拍攝過自己,結果它返回的值取決於操作系統。 – Mariusz

+0

我真的不知道。但是,您可以使用「校驗和(Convert(varbinary,null))」來代替對數字進行硬編碼。然後,如果值隨着db版本而改變,你仍然會受到保護。 –

相關問題