2008-10-15 19 views
6

Necesito indexar un campo varchar en mi tabla en MS SQL Server 2005, pero no tengo claro cómo hacerlo. Si trato de agregar un índice no agrupado en el campo, dice "Columna 'xxxx' en la tabla 'mytable' es de un tipo que no es válido para usar como columna de clave en un índice"Indexar varchar en MS SQL Server 2005

Mi tabla tiene un ID int de incremento automático que se establece como la clave principal en la tabla. Si establezco esta propiedad como el índice y luego agrego mi columna varchar como una "columna incluida", el índice pasa. Pero no estoy seguro de que eso sea lo que quiero, quiero poder buscar en la tabla basándome solo en el campo varchar, y mi comprensión de los índices fue que todos los elementos indexados debían proporcionarse para ver realmente una aceleración en la consulta, pero no quiero tener que incluir la ID int (porque no sé qué es, en el momento de esta consulta dada).

¿Estoy tratando de hacer esto incorrectamente? ¿El ID + my varchar como columna incluida lograría lo que estoy buscando?

Respuesta

10

¿Es varchar(max)? Creo que no se permite que se utilicen en un índice.

De lo contrario, publique su declaración CREATE TABLE, normalmente no hay ningún problema para agregar un varchar a un índice.

2

No, la columna ID + varchar no funcionaría. Eso funcionaría muy bien para las consultas en las que realiza una búsqueda en el ID y solo selecciona la ID y/o la columna varchar; entonces tendría un índice de cobertura y todo podría recuperarse solo mirando el índice.

Supongo que tiene un índice agrupado en su columna de identificación ya que esa es la clave principal. Entonces necesitarías crear un índice no agrupado en la columna varchar, que debería ser posible. El índice no agrupado también incluirá automáticamente la identificación.

Recuerde también que el índice solo será útil para consultas como WHERE VarcharColumn = 'xyz' y WHERE VarcharColumn LIKE 'xyz%'.

No será de ayuda para LIKE '% xyz%' y '% xyz' consultas.

0

No necesita incluir el campo varchar en la clave principal para que se indexe. Para crear un índice, simplemente modifique la tabla en Management Studio, haga clic en el botón Administrar índices y claves y haga clic en Agregar para agregar un nuevo índice. Luego seleccione el campo VARCHAR. No debe haber ningún problema.

1

Al establecer una columna como clave principal por defecto se crea un índice agrupado, por lo que no tiene que crear otro índice INT + VARCHAR.

Lo que está buscando es un índice en su VARCHAR solo - sin + INT, ya que su clave principal está implícitamente incluida - después de todo SQL Server debería ser capaz de localizar la fila real al realizar búsquedas de índice. Sin embargo, existe una restricción, creo que el tamaño total de las columnas de índice debería ser < 900 bytes (al menos lo era con SQL Server 2000). ¿Cuánto dura tu VARCHAR?

4

Supongo que la suya es una columna VARCHAR (MAX) que, como dice el error, es un tipo de datos invalida para un índice. Sugerencia: cree una columna calculada que sea el valor hash de la columna VARCHAR (MAX) (por ejemplo, utilizando la función HashBytes) y luego cree un índice únicamente en la columna calculada. Luego, en la condición de búsqueda (por ejemplo, la cláusula WHERE) de su DML SQL, utilizará el valor de búsqueda VARCHAR (MAX) más un hash de su valor de búsqueda VARCHAR (MAX) en las columnas correspondientes de su tabla. Puede ser una buena idea encapsular el hash de los valores de búsqueda en un procedimiento almacenado 'auxiliar'.

+0

+1 Por mencionar la función HashBytes – CSharper