2011-10-18 10 views
6

URL'leri tutacak bir sütuna bir dizin koymaya çalışıyorum. Bir URL'nin maksimum uzunluğu 2000 karakterden uzun olduğu için veri türünü NVARCHAR (3000) olarak ayarlıyorum. Bunu yaptığımda The total size of an index or primary key cannot exceed 900 bytes hatasını aldım. Kayıtları URL ile aramam gerekebileceğinden, URL Sütümümde bir dizine ihtiyacım var. Bu sınırlamanın etrafında bir yolu var mı?SQL Server: Bir dizinin veya birincil anahtarın toplam boyutu 900 bayttan fazla olamaz

+0

Bu gerçekten bana çok etkili gelmiyor. Aslında, DB motorunun yönetmesi için tam bir kabus gibi geliyor. URL’ye göre arama yapmanız * gerektiğini ve bu aramanın yavaş olacağını belirlediniz mi? Metin araması bildiğiniz kadar hızlı olabilir. Ayrıca, URL'yi bitler halinde ayırabilmeniz, bu bitlerden yalnızca birini (en fazla değişiklik gösteren) endeksleyebileceğiniz ve daha sonra dizin bölümünü tüm URL'ye bağlayabileceğiniz de vardır. Kısacası burada birçok olası strateji var. – Robinson

cevap

10

URL'nin sağlama toplamı için hesaplanmış bir sütun oluşturabilir ve ardından sorgudaki sağlama toplamını kullanabilirsiniz. Checksums benzersiz olmayacaktır, ancak olası eşleşme sayısını hızla daraltacaktır.

Birincisi, böyle, masanıza bir hesaplanan sütun ekleyin:

Alter Table YourTableName Add URL_HASH As CheckSum(URL) 

Şimdi endeksi kolon böyle:

Create Index idx_YourTableName_URL_HASH On YourTableName(URL_HASH) 

Şimdi bir dizin arama yapacak bir sorgu yazabilirsiniz Aradığınız satırı bulmak için:

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

Bu yöntem, tam eşleme için çok iyi çalışmalıdır es. Kısmi eşleşmeler istiyorsanız, tam metin arama işlevini kullanmanız daha iyi olur.

+0

Bunu uygulamaya karar verdik. – Luke101

+0

Merhaba G Mastros. Cevabınız için teşekkürler. Çok fazla veriyi tutan Varbinary sütunum var. Bu sütun boş olabilir ve bu sütunun boş olmadığı kayıtlara bakan sorgularım var. Bu durumda da sağlama toplamı yaklaşımınız çok yararlı görünüyor. NULL tıklanabilir sütun için sağlama toplamı 2147483647 olduğunu kontrol ettim. Çalışabilir, ancak sorgularda bu numarayı sabit kodlamak garip görünüyor. SqlServer'ın diğer sürümüne geçtiğimizde bu sayı aynı olacak mı? C# 'de GetHashCode yöntemini kullanarak bir kez ayağıyla kendimi çektim ve sonuçta OS'ye bağlı olarak farklı bir değer döndürdü. – Mariusz

+0

Gerçekten emin değilim. Ancak, sayı kodlaması yerine "sağlama toplamı (Convert (varbinary, null))" kullanabilirsiniz. Ardından, değer db sürümü ile değişirse, yine de korunursunuz. –