2011-10-18 10 views
6

Estoy tratando de poner un índice en una columna que contendrá las URL. Como la longitud máxima de una URL puede ser de más de 2000 caracteres, configuro el tipo de datos a NVARCHAR (3000). Cuando hice esto obtuve el error The total size of an index or primary key cannot exceed 900 bytes. Como es posible que necesite buscar registros por URL, necesitaré un índice en mi Columna de URL. ¿Hay alguna forma de evitar esta limitación?Servidor SQL: el tamaño total de un índice o clave principal no puede exceder 900 bytes

+0

Eso realmente no me parece muy eficiente. De hecho, parece una pesadilla completa para el motor de DB. ¿Ha establecido que * do * necesita buscar por URL, y que esta búsqueda va a ser lenta? La búsqueda de texto puede ser bastante rápida, ya sabes. También existe la posibilidad de que pueda dividir la URL en bits, indexar solo uno de esos bits (el que más varía) y luego relacionar la parte del índice con la url completa. En resumen, hay muchas estrategias posibles aquí. – Robinson

Respuesta

10

Puede crear una columna calculada para la suma de comprobación de la URL y luego usar la suma de comprobación en la consulta. Checksums no será único, pero reducirá rápidamente el número de posibles coincidencias.

En primer lugar, añadir una columna calculada a su mesa, así:

Alter Table YourTableName Add URL_HASH As CheckSum(URL) 

Ahora índice de la columna así:

Create Index idx_YourTableName_URL_HASH On YourTableName(URL_HASH) 

Ahora usted puede escribir una consulta que va a hacer una búsqueda de índice para encontrar la fila que está buscando:

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

Este método debería funcionar muy bien para la coincidencia exacta es. Si desea coincidencias parciales, es mejor utilizar la funcionalidad de búsqueda de texto completo.

+0

Gracias decidimos implementar esto. – Luke101

+0

Hola G Mastros. Gracias por tu respuesta. Tengo una columna Varbinary que contiene una gran cantidad de datos. Esta columna puede ser nula y tengo una consulta que busca registros donde esta columna no es nula. Su enfoque de suma de comprobación también parece ser muy útil en este caso. Comprobé que la suma de comprobación para la columna que admite nulos es 2147483647. Aunque puede funcionar, parece extraño codificar este número en las consultas. ¿Este número será el mismo cuando migremos a otra versión de SqlServer? Me pegué un tiro en el pie una vez que usé el método GetHashCode en C# y terminó devolviendo un valor diferente según el sistema operativo. – Mariusz

+0

Realmente no lo sé con certeza. Sin embargo, en lugar de codificar el número, podría usar "suma de comprobación (Convertir (varbinary, null))". Luego, si el valor cambia con la versión db, aún estará protegido. –

1

La búsqueda de texto completo de SQL Server es lo que probablemente desee.

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

usted tiene que saltar a través de unos aros de menor importancia con su puesta en marcha frente a un índice simple pero no debería ser súper duro.

Cuestiones relacionadas