Rellenado de índices de texto completo

La creación y mantenimiento de un índice de texto completo implica rellenar el índice utilizando un proceso denominado rellenado (o rastreo). SQL Server admite los tipos siguientes de rellenado: completo, automático o manual basado en el seguimiento de cambios, y basado en la marca de tiempo incremental.

Rellenado completo

Durante un rellenado completo, se crean entradas de índice para todas las filas de una tabla o vista indizada. Un rellenado completo de un índice de texto completo genera entradas de índice para todas las filas de la tabla base o vista indizada.

De forma predeterminada, SQL Server rellena totalmente un nuevo índice de texto completo en cuanto se crea. Sin embargo, un rellenado completo puede consumir una cantidad significativa de recursos. Por consiguiente, al crear un índice de texto completo durante los períodos de máxima utilización, suele ser aconsejable retrasar el rellenado completo hasta un momento de menor uso, particularmente si la tabla base de un índice de texto completo es grande. Sin embargo, el catálogo de texto completo al que pertenece el índice no se puede usar hasta que se rellenan todos sus índices de texto completo. Para crear un índice de texto completo sin rellenarlo inmediatamente, especifique la cláusula NO POPULATION, CHANGE_TRACKING OFF, en la instrucción de Transact-SQL CREATE FULLTEXT INDEX. SQL Server no rellenará el nuevo índice de texto completo hasta que se ejecute la instrucción de Transact-SQL ALTER FULLTEXT INDEX utilizando la cláusula START FULL POPULATION o START INCREMENTAL POPULATION. Para obtener más información, vea los ejemplos "A. Crear un índice de texto completo sin ejecutar un rellenado completo" y "B. Ejecutar un rellenado completo en la tabla", posteriormente en este tema.

Rellenado basado en el seguimiento de cambios

Si se desea, se puede utilizar el seguimiento de cambios para mantener un índice de texto completo después de su rellenado completo inicial. El seguimiento de cambios provoca una pequeña sobrecarga de trabajo porque SQL Server mantiene una tabla en la que realiza el seguimiento de los cambios de la tabla base desde el último rellenado. Cuando se utiliza el seguimiento de cambios, SQL Server mantiene un registro de las filas de la tabla base o la vista indizada que se han modificado con las actualizaciones, eliminaciones o inserciones. Los cambios realizados en los datos con WRITETEXT y UPDATETEXT no se reflejan en el índice de texto completo y no se recopilan con el seguimiento de cambios.

[!NOTA]

Para las tablas que contienen una columna timestamp, puede utilizar los rellenados incrementales.

Cuando el seguimiento de cambios está habilitado durante la creación de índices, SQL Server rellena totalmente el nuevo índice de texto completo justo después de crearse. Después de esto, los cambios se siguen y propagan al índice de texto completo. Hay dos tipos de seguimiento de cambios: automático (opción CHANGE_TRACKING AUTO) y manual (opción CHANGE_TRACKING MANUAL). El seguimiento de cambios automático es el comportamiento predeterminado.

El tipo de seguimiento de cambios determina cómo se rellena el índice de texto completo, de la forma siguiente:

  • Rellenado automático

    De forma predeterminada, o si especifica CHANGE_TRACKING AUTO, el motor de búsqueda de texto completo utiliza el rellenado automático en el índice de texto completo. Una vez completado el rellenado total inicial, se realiza el seguimiento de los cambios cuando los datos se modifican en la tabla base y los cambios sometidos a seguimiento se propagan de forma automática. Sin embargo, el índice de texto completo se actualiza en segundo plano, de modo que los cambios propagados podrían no reflejarse inmediatamente en el índice.

    Para configurar el seguimiento de los cambios con rellenado automático

    Para obtener más información, vea el ejemplo "E. Modificar un índice de texto completo para utilizar el seguimiento de cambios automático", posteriormente en este tema.

  • Rellenado manual

    Si especifica CHANGE_TRACKING MANUAL, el motor de búsqueda de texto completo utiliza el rellenado automático en el índice de texto completo. Una vez completado el rellenado total inicial, se realiza el seguimiento de los cambios cuando los datos se modifican en la tabla base. Sin embargo, no se propagan al índice de texto completo hasta que se ejecuta una instrucción ALTER FULLTEXT INDEX… START UPDATE POPULATION. Puede utilizar el Agente SQL Server para llamar a esta instrucción de Transact-SQL de forma periódica.

    Para iniciar el seguimiento de cambios con rellenado manual

    Para obtener más información, vea los ejemplos "C. Crear un índice de texto completo con seguimiento de cambios manual" y "D. Ejecutar un rellenado manual", posteriormente en este tema.

Para configurar el seguimiento de los cambios sin seguimiento de cambios

Rellenado basado en la marca de tiempo incremental

Un rellenado incremental es un mecanismo alternativo para rellenar un índice de texto completo manualmente. Puede ejecutar un llenado incremental de un índice de texto completo que tenga CHANGE_TRACKING configurado en MANUAL o en OFF. Si el primer llenado de un índice de texto completo es un llenado incremental, indiza todas las filas, lo que lo hace equivalente a un llenado completo. Para realizar un llenado incremental, es necesario que la tabla indizada tenga una columna del tipo de datos timestamp. Si no existe una columna de tipo timestamp, no puede llevarse a cabo un llenado incremental. Si se solicita un rellenado incremental en una tabla sin una columna de tipo timestamp, se llevará a cabo un rellenado completo. Además, si alguno de los metadatos que afectan al índice de texto completo de la tabla ha cambiado desde el último rellenado, las solicitudes de rellenado incremental se implementan como rellenados completos. Esto incluye los cambios en los metadatos ocasionados al alterar la definición de una columna, índice o índice de texto completo.

SQL Server utiliza la columna timestamp para identificar las filas que han cambiado desde el último rellenado. El rellenado incremental actualiza entonces el índice de texto completo de las filas que se hayan agregado, eliminado o modificado desde el último rellenado o en el curso del último rellenado. Si una tabla experimenta un volumen alto de inserciones, el rellenado incremental puede ser más eficaz que el rellenado manual.

Al final de un proceso de rellenado, el motor de texto completo registra un nuevo valor de tipo timestamp. Este valor es el valor de timestamp mayor que el recopilador de SQL ha encontrado. Se usará cuando se inicie un rellenado incremental posterior.

Para ejecutar un rellenado incremental, ejecute una instrucción ALTER FULLTEXT INDEX utilizando la cláusula START INCREMENTAL POPULATION.

Para programar un trabajo de rellenado incremental

Ejemplos

[!NOTA]

Los ejemplos de esta sección usan la tabla Production.Document o HumanResources.JobCandidate de la base de datos de ejemplo AdventureWorks. Para obtener información sobre estas tablas, vea la tabla de documentos y Tabla JobCandidate (AdventureWorks).

A. Crear un índice de texto completo sin ejecutar un rellenado completo

En el ejemplo siguiente se crea un índice de texto completo en la tabla Production.Document de la base de datos de ejemplo AdventureWorks. En este ejemplo se utiliza WITH CHANGE_TRACKING OFF, NO POPULATION para retrasar el rellenado completo inicial.

CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);
CREATE FULLTEXT CATALOG AW_Production_FTCat;
CREATE FULLTEXT INDEX ON Production.Document
(
    Document                         --Full-text index column name 
        TYPE COLUMN FileExtension    --Name of column that contains file type information
        Language 1033                 --1033 is LCID for the English language
)
    KEY INDEX ui_ukDoc
    ON AW_Production_FTCat
    WITH CHANGE_TRACKING OFF, NO POPULATION;
GO

B. Ejecutar un rellenado completo en la tabla

En el ejemplo siguiente se ejecuta un rellenado completo en la tabla Production.Document de la base de datos de ejemplo AdventureWorks.

ALTER FULLTEXT INDEX ON Production.Document
   START FULL POPULATION;

C. Crear un índice de texto completo con seguimiento de cambios manual

En el ejemplo siguiente se crea un índice de texto completo que utilizará el seguimiento de cambios con rellenado manual en la tabla HumanResources.JobCandidate de la base de datos de ejemplo AdventureWorks.

USE AdventureWorks;
GO
CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID);
CREATE FULLTEXT CATALOG ft AS DEFAULT;
CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume) 
   KEY INDEX ui_ukJobCand 
   WITH CHANGE_TRACKING=MANUAL;
GO

D. Ejecutar un rellenado manual

En el ejemplo siguiente se ejecuta un rellenado manual en el índice de texto completo sometido a seguimiento de la tabla HumanResources.JobCandidate de la base de datos de ejemplo AdventureWorks.

USE AdventureWorks;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION;
GO

E. Modificar un índice de texto completo para utilizar el seguimiento de cambios automático

En el ejemplo siguiente se cambia el índice de texto completo de la tabla HumanResources.JobCandidate de la base de datos de ejemplo AdventureWorks para utilizar el seguimiento de cambios con rellenado automático.

USE AdventureWorks;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO;
GO