2011-10-18 29 views
6

Tôi đang cố gắng đặt một chỉ mục trên một cột sẽ giữ URL. Vì độ dài tối đa của một URL dài hơn 2000 ký tự nên tôi đặt kiểu dữ liệu là NVARCHAR (3000). Khi tôi đã làm điều này tôi đã nhận được lỗi The total size of an index or primary key cannot exceed 900 bytes. Vì tôi có thể cần phải tìm kiếm các bản ghi bằng URL, tôi sẽ cần một chỉ mục trên Cột URL của tôi. Có cách nào xung quanh giới hạn này không?Máy chủ SQL: Tổng kích thước của chỉ mục hoặc khóa chính không thể vượt quá 900 byte

+0

Điều đó thực sự không có hiệu quả với tôi. Trong thực tế, nó âm thanh như một cơn ác mộng hoàn chỉnh cho động cơ DB để quản lý. Bạn đã thiết lập rằng bạn * cần * cần phải tìm kiếm bằng URL và tìm kiếm này sẽ bị chậm? Tìm kiếm văn bản có thể khá nhanh chóng mà bạn biết. Ngoài ra còn có khả năng bạn có thể chia nhỏ URL thành các bit, chỉ lập chỉ một trong số các bit đó (một số thay đổi nhiều nhất) và sau đó liên kết phần chỉ mục với toàn bộ url. Trong ngắn hạn có rất nhiều chiến lược có thể ở đây. – Robinson

Trả lời

10

Bạn có thể tạo cột được tính cho tổng kiểm tra của URL và sau đó sử dụng tổng kiểm tra trong truy vấn. Checksums sẽ không phải là duy nhất, nhưng nó sẽ nhanh chóng thu hẹp số lượng các trận đấu có thể.

Đầu tiên, thêm một cột tính để bàn của bạn, như thế này:

Alter Table YourTableName Add URL_HASH As CheckSum(URL) 

Bây giờ chỉ số cột như thế này:

Create Index idx_YourTableName_URL_HASH On YourTableName(URL_HASH) 

Bây giờ bạn có thể viết một truy vấn mà sẽ làm một chỉ mục tìm kiếm để tìm hàng bạn đang tìm kiếm:

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

Phương pháp này sẽ hoạt động rất tốt để khớp chính xác es. Nếu bạn muốn kết hợp từng phần, bạn nên sử dụng chức năng tìm kiếm toàn văn.

+0

Cảm ơn chúng tôi đã quyết định thực hiện điều này. – Luke101

+0

Hi G Mastros. Cảm ơn câu trả lời của bạn. Tôi có cột Varbinary chứa rất nhiều dữ liệu. Cột này có thể là null và tôi có truy vấn tìm kiếm các bản ghi trong đó cột này không phải là rỗng. Phương pháp kiểm tra của bạn dường như rất hữu ích trong trường hợp này. Tôi đã kiểm tra rằng checksum cho cột nullable là 2147483647. Mặc dù nó có thể làm việc nhưng nó có vẻ lạ để mã cứng số này trong các truy vấn. Liệu con số này có giống nhau khi chúng ta chuyển sang phiên bản SqlServer khác không? Tôi đã tự bắn vào chân một khi sử dụng phương pháp GetHashCode trong C# và nó kết thúc nó trả về giá trị khác nhau phụ thuộc vào hệ điều hành. – Mariusz

+0

Tôi thực sự không biết chắc chắn. Tuy nhiên, thay vì hardcoding số bạn có thể sử dụng "checksum (Convert (varbinary, null))". Sau đó, nếu giá trị thay đổi với phiên bản db, bạn sẽ vẫn được bảo vệ. –

1

Tìm kiếm Toàn văn SQL Server là những gì bạn có thể sẽ muốn.

http://msdn.microsoft.com/en-us/library/ms142571.aspx

Bạn cần phải nhảy qua một số hoops nhỏ với cài đặt nó lên vs một chỉ số đơn giản nhưng nó không phải là siêu cứng.

Các vấn đề liên quan