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
cevap
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.
Bunu uygulamaya karar verdik. – Luke101
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
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. –
SQL Server Tam Metin arama, muhtemelen isteyeceğiniz şeydir.
http://msdn.microsoft.com/en-us/library/ms142571.aspx
Basit endeksi vs kurduktan ile bazı küçük çemberler üzerinden atlamak zorunda ama süper sert olmamalıdır.
- 1. SUM toplam süresinde SQL Server
- 2. Kümelenmiş birincil anahtar, SQL Server 2005
- 3. SQL Server'da 8000 bayttan fazla karmalama
- 4. Birincil anahtarın beğenisi mi?
- 5. Bir Kompozit Birincil Anahtarın parçası olan SQL Tablo Yabancı Anahtarı
- 6. datetime alanında SQL Server birincil anahtarı
- 7. SQL Server: Veri Sayfa boyutu karışıklık: 8060 + 96 bayt hala 8k bayttan daha az
- 8. SQL Server hatası: Birincil dosya grubu
- 9. Kayıt veya SQL Server
- 10. SQL Server 2012'de dizinin kullanımı
- 11. Entity Framework: bileşik anahtarın alanı null olamaz?
- 12. SQL Server CE veritabanı boyutu sorunu
- 13. SQL Server 2005'te VARBINARY alanının boyutu
- 14. SQL Server bir bileşik birincil anahtarı nasıl depolar?
- 15. bir SQL Server veritabanı için veya
- 16. Microsoft SQL Server Yayımlama
- 17. SQL Server 2005 acemi sorgu
- 18. Birincil Anahtarın bir parçası bir Yabancı Anahtar olan JPA'da bileşik birincil anahtar nasıl eşlenir?
- 19. Toplam MongoDB veri depolama boyutu
- 20. SQL Server: tek bir soru
- 21. SQL Server: Nasıl toplamı?
- 22. SQL Server
- 23. SQL Server - Birincil anahtar olmadan komut dosyası oluştur
- 24. C: İki boyutlu dizinin boyutu
- 25. Denetleyici, 1024 bayttan fazla veriyle sonuç göndermiyor - Oynatma Çerçevesi 2,1
- 26. SQL Server
- 27. SQL Server Yinelenen Denetleme
- 28. Toplam sonucu olarak SQL
- 29. SQL toplam sayısı =
- 30. SQL Server, bir 'durum'
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