Mejorar el rendimiento de las consultas de texto completo en SQL Server

Seleccione idioma Seleccione idioma
Id. de artículo: 2549443 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

En este artículo se describe un método para mejorar el rendimiento de las consultas que usan los predicados de búsqueda de texto completo (por ejemplo, CONTAINS y CONTAINSTABLE) y que también filtrar los datos de Microsoft SQL Server. Por ejemplo, este método mejora el rendimiento de la consulta siguiente:
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
Este método le permite diseñar la consulta, esquema de la tabla e índice de texto completo de tal manera que el motor de búsqueda de texto completo se filtra los resultados antes de enviarlos al motor relacional. Por lo tanto, no tiene el motor relacional filtrar un conjunto de datos de gran tamaño.

Más información

Cuando se crea una consulta de búsqueda de texto completo, el factor principal que afecta el rendimiento de la consulta es la cantidad de datos que debe procesar el motor de búsqueda de texto completo antes de los restantes datos se envían al motor relacional. En SQL Server, puede mejorar el rendimiento de la consulta al filtrar filas temprano para reducir el número de filas que se deben procesar más adelante.

En las versiones de SQL Server que se publicaron antes de SQL Server 2008, el motor de búsqueda de texto completo devuelve todas las filas que coinciden con un término de búsqueda y, a continuación, el motor relacional se aplica a todos los filtros. Se han realizado mejoras a este comportamiento en SQL Server 2008, en SQL Server 2008 R2 y en SQL Server 2012. Sin embargo, es difícil de utilizar estas mejoras, ya que los índices de búsqueda de texto completo se organizan de forma muy distinta de los índices de base de datos. Además, el motor de búsqueda de texto completo y el motor relacional funcionan de forma muy diferente. Por lo tanto, el método descrito en este artículo utiliza la función con valores de tabla (TVF) para filtrar las filas temprano y para reducir el número de filas que se deben procesar más adelante.

Por ejemplo, el plan de consulta siguiente devuelve 131051 filas que coinciden con una cadena de búsqueda CONTAINS. Además, un operador de combinación en el plan realiza filtrado adicional mediante el uso de una búsqueda de índice.
Rows StmtText 
-------------------- -----------------------------------------------------------------------------------------------------------
1167 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate> '08/05/2019' 

1167 |--Merge Join(Left Semi Join, MERGE:([FTSdb].[dbo].[fttest].[ID])=(FulltextMatch.[docid]), RESIDUA
5858 |--Sort(ORDER BY:([FTSdb].[dbo].[fttest].[ID] ASC)) 
5858 | |--Clustered Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[clidx1]), SEEK:([FTSdb].[
131051 |--Table-valued function 
Sin embargo, si la consulta incluye la columna de clave de índice único de texto como un predicado, el motor de búsqueda de texto completo puede utilizar el predicado para filtrar los resultados en el nivel de texto completo. En esta situación, la función TVF devuelve una cantidad mucho menor de los datos antes de que se debe aplicar el filtrado adicional. Por ejemplo, la siguiente consulta especifica cinco valores que deben coincidir con la condición de c2, y la función TVF devuelve sólo aquellos resultados que coincidan con los cinco valores:
Rows StmtText 

-------- ---------------------------------------------------------------------------------------------------------------------------------
5 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate > '08/05/2019' and ID in ( 654051, 644051, 649106, 465, 105)

5 |--Nested Loops(Left Semi Join, OUTER REFERENCES:([FTSdb].[dbo].[fttest].[ID])) 
5 |--Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[idx1]), SEEK:([FTSdb].[dbo].[fttest].[ID]=(105) OR ...
5 |--Table-valued function
Capacidad del motor de búsqueda de texto completo de empuje hacia abajo de los valores que son utilizados por la clave de índice único es la base del método siguiente.

Si un predicado contiene una columna de tipo de datos de fecha y hora, puede incluir información sobre la fecha en la columna de clave de índice único para que sólo las filas que coincidan con este predicado se emiten. Para ello, debe incorporar lógicamente la información de fecha en la columna de clave. Sin embargo, también tendrá que cambiar el tipo de datos de la columna de clave y las aplicaciones que utilizan la consulta.

Para implementar el método, cambie el tipo de datos de texto completo única clave ID a BIGINT. Los 4 primeros bytes de la captura de Id. clave el año, mes y los valores de fecha de la columna de fecha y los últimos cuatro bytes permanecen igual. Por ejemplo, el primer byte de la clave que ID podría referirse al año, el siguiente byte podría referirse al mes, y los dos últimos bytes puede hacer referencia a la fecha. La aplicación debe adaptarse a este cambio de tipo de datos.

A continuación, traducir un predicado de rango para un predicado en la clave de identificación. Por ejemplo, la "x<>< y"="" range="" predicate="" can="" be="" translated="" to="" the="" "(x*2^32="">< id="">< y*2^32)"="" predicate.="" because="" the="" translated="" predicate="" is="" a="" predicate="" on="" the="" full-text="" key,="" the="" predicate="" will="" be="" pushed="" down="" into="" the="" full-text="" streaming="" table-valued="" functions="" (stvf).="" this="" behavior="" effectively="" performs="" searches="" within="" the="" date="">

Propiedades

Id. de artículo: 2549443 - Última revisión: viernes, 22 de marzo de 2013 - Versión: 2.0
La información de este artículo se refiere a:
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Enterprise Evaluation
  • Microsoft SQL Server 2008 R2 Datacenter
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 R2 Enterprise
  • Microsoft SQL Server 2008 R2 Standard
  • Microsoft SQL Server 2012 Developer
  • Microsoft SQL Server 2012 Standard
  • Microsoft SQL Server 2012 Web
  • Microsoft SQL Server 2012 Enterprise
Palabras clave: 
kbmt KB2549443 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 2549443

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com