2009-05-06 38 views
6

Tengo una tabla de base de datos con varias columnas; la mayoría de ellos son columnas de tipo VARCHAR(x), y algunas de estas columnas tienen un índice para que pueda buscar rápidamente datos dentro de ella.SQL Server; índice en la columna TEXTO

Sin embargo, una de las columnas es una columna TEXT, porque contiene una gran cantidad de datos (23 kb de texto ascii simple, etc.). Quiero poder buscar en esa columna (... WHERE col1 LIKE '%search string%'...), pero actualmente lleva una eternidad llevar a cabo la consulta. Sé que la consulta es lenta debido a esta búsqueda de columna porque cuando elimino ese criterio de la cláusula WHERE, la consulta se completa (lo que yo consideraría), de forma instantánea.

No puedo agregar un índice en esta columna porque esa opción está atenuada para esa columna en el generador de índices/asistente en SQL Server Management Studio.

¿Cuáles son mis opciones aquí, para acelerar la búsqueda de consultas en esa columna?

Gracias por su tiempo ...

Actualizar
Ok, por lo que se veía en la búsqueda de texto completo e hicieron todas esas cosas, y ahora me gustaría ejecutar consultas. Sin embargo, al usar "contiene", solo acepta una palabra; ¿y si necesito una frase exacta? ... WHERE CONTAINS (col1, 'search phrase') ... arroja un error.

Lo siento, soy nuevo en SQL Server

Actualización 2 lo siento, simplemente descubierto; utilice varias cláusulas "contiene" en lugar de una cláusula con varias palabras. En realidad, esto todavía no obtiene lo que quiero (la frase exacta) solo se asegura de que todas las palabras en la frase estén presentes.

Respuesta

9

La búsqueda de campos TEXT es siempre bastante lenta. Prueba Full Text Search y prueba si eso funciona mejor para ti.

+0

+1: ¡El texto completo es el camino a seguir, seguro! –

+0

El enlace ya no funciona. Por favor, corrige si es posible! – Andreas

+0

El enlace está ahora fijado –

4

Debería estar mirando usando la indización de texto completo en la columna.

4

Si sus consultas son como LIKE '%string%' (i. E. Que la búsqueda de una cadena dentro de un campoTEXT), entonces usted tendrá un índice FULLTEXT.

Si busca una subcadena que comienza en el del campo (LIKE 'string%') y utilizar SQL Server 2005 o superior, entonces usted puede convertir su TEXT en un VARCHAR(MAX), crear una columna calculada y el índice de esta columna.

Lee este artículo en mi blog para los detalles de rendimiento:

0

Usted puede hacer consultas booleanas complejas en FTS; como

contiene (yourcol, ' 'Mi primera picadura' o 'mi segunda cadena' y 'mi tercera cadena'')

Dependiendo de su consulta o CONTAINSTABLE FREETEXTTABLE podría dar mejores resultados.

Si se está conectando a través de .Net es posible que desee mirar a A google full text search

+0

Acabo de probar su variación, y no funciona; en primer lugar, requiere el uso de 'y no', y la segunda adición de segunda o varias palabras no funciona si utilizo 'o' en la consulta – user85116

+0

Mi error necesita una sola 'al final la sintaxis es Contiene (* o colname, "sus datos" y "algunos otros datos") http://msdn.microsoft.com/en-us/library/ms187787.aspx – u07ch

0

Y ya que nadie ya ha dicho que (tal vez porque es obvio) consultar LIKE '%string%' pasa por encima de los índices existentes - por lo que se quedará lento. Por lo tanto, por qué necesita usar la indexación de texto completo. (que es lo que dijo Quassnoi).

Corrección - Estoy seguro de que aprendí esto, y siempre lo creí, pero después de algunos investigarlo (al usar comodín al principio) parece estar bien? ¡Mis viejas consultas de expresiones regulares funcionan mejor con me gusta!

Cuestiones relacionadas