9

En primer lugar, debo señalar que no tengo mucho conocimiento sobre los índices de SQL Server.La indexación mejorará el rendimiento de consultas varchar (max) y cómo crear el índice

Mi situación es que tengo una tabla de base de datos de SQL Server 2008 que tiene una columna varchar (max) generalmente llena con un lote de texto.

aplicación web

Mi ASP.NET tiene una función de búsqueda que pregunta en esta columna para las búsquedas de palabras clave, y en función del número de palabras clave buscadas por su puede ser uno o muchos COMO '% palabra clave%' declaraciones en la consulta SQL para hacer la búsqueda

Mi aplicación web también permite buscar otras columnas en esta tabla, no solo esa columna. También hay algunas combinaciones de otras tablas también.

Mi pregunta es, ¿vale la pena crear un índice en esta columna para mejorar el rendimiento de estas consultas de búsqueda? Y si es así, ¿qué tipo de índice bastará para indexar una columna o debo incluir otras columnas, como la clave principal y otras columnas de búsqueda?

Respuesta

7

No vale la pena crear un índice regular si está haciendo COMO '% keyword%' búsquedas. La razón es que la indexación funciona como buscar un diccionario, donde comienzas en el medio y luego divides la diferencia hasta que encuentres la palabra. Esa consulta de comodín es como pedirle que busque una palabra que contenga el texto "a" o algo así. La única forma de encontrar coincidencias es escanear todo el diccionario.

Sin embargo, podría considerar una búsqueda de texto completo, que es para este tipo de escenario (see here).

0

La mejor manera de averiguarlo es crear un conjunto de consultas de prueba que se asemejan a lo que sucedería en la vida real e intentar ejecutarlas en su base de datos con y sin el índice. Sin embargo, en general, si realiza muchas consultas SELECT y pocas consultas UPDATE/DELETE, un índice podría hacer sus consultas más rápido.

Sin embargo, si realiza muchas actualizaciones, el índice puede dañar su rendimiento, por lo que debe saber qué tipo de consultas tendrá que tratar su BD antes de tomar esta decisión.

15

no puede crear un índice en un campo varchar (max). La cantidad máxima de bytes en un índice es 900. Si la columna tiene más de 900 bytes, puede crear el índice pero cualquier inserción con más de 900 bytes fallará.

Le sugiero que lea sobre fulltext búsqueda. Debe le convenga en este caso

+0

Diego, según tengo entendido, podría indexar en una columna varchar (max) siempre que es un índice fuera de clúster, sin clústeres y que la columna var (max) está INCLUDEed, por ejemplo CREATE INDICE NO CLASIFICADO IndexName ON TableName (SomeColumn) INCLUDE (VarcharMaxColumn) WITH (ONLINE = OFF) – johna

+1

varchar (max) solo puede estar en incluido en un índice, significa que solo los niveles de hoja participarán en el índice, lo que significa que apenas se utilizará en una consulta de búsqueda – Diego

+1

CON (ONLINE = OFF) no es una propiedad del índice. Indica que el índice se establecerá fuera de línea durante la creación. Si lo configura en ON, el índice se creará en tempDB y se podrá acceder a la tabla durante el proceso de creación del índice. Se debe usar para tablas enormes donde la creación de un índice lleva mucho tiempo y la tabla no puede ser inaccesible durante la creación – Diego

20

La mejor analogía que he visto de por qué un índice no ayudará '%wildcard%' búsquedas:

Tomar dos personas. Déles a cada uno la misma guía telefónica. Dígale a la persona a su izquierda:

Cuéntame cuántas personas están en esta guía telefónica con el apellido "Smith".

Ahora dicen a la persona a su derecha:

Dime cuántas personas se encuentran en esta guía telefónica con el primer nombre de "Simon."

Un índice es como una guía telefónica. Muy fácil de buscar lo que está en el comienzo. Muy difícil de explorar en busca de lo que está en el medio o al final.

Cada vez que lo he repetido en una sesión, veo encender las bombillas, así que pensé que podría ser útil compartirlo aquí.

+0

Esta es la analogía que siempre uso. –

Cuestiones relacionadas