População do índice de texto completo

Cria e manter um índice de texto completo envolve preencher o índice através de um processo chamado de população (também conhecido como rastreamento). O SQL Server dá suporte aos seguintes tipos de população: população completa, população manual ou automática com base em controle de alterações e população incremental com base em carimbo de data e hora.

População completa

Durante uma população completa, entradas de índice são criadas para todas as linhas de uma tabela ou exibição indexada. Uma população completa de um índice de texto completo cria entradas de índice para todas as linhas da tabela base ou da exibição indexada.

Por padrão, o SQL Server popula totalmente um novo índice de texto completo assim que ele é criado. No entanto, uma população completa pode consumir recursos consideráveis. Portanto, quando você criar um índice de texto completo durante períodos de pico, uma prática recomendada é atrasar a população completa até uma hora fora do horário de pico, principalmente se a tabela base de um índice de texto completo for grande. Todavia, o catálogo de texto completo ao qual o índice pertence não poderá ser utilizado até que todos os índices de texto completo estejam populados. Para criar um índice de texto completo sem populá-lo imediatamente, especifique a cláusula CHANGE_TRACKING OFF, NO POPULATION na instrução Transact-SQL CREATE FULLTEXT INDEX. O SQL Server não populará o novo índice de texto completo até que você execute uma instrução Transact-SQL ALTER FULLTEXT INDEX usando a cláusula START FULL POPULATION ou START INCREMENTAL POPULATION. Para obter mais informações, consulte os exemplos “A. Criando um índice de texto completo sem executar uma população completa" e "B. Executando uma população completa em tabela", mais adiante neste tópico.

População com base em controle de alterações

Como opção, você pode usar o controle de alterações para manter um índice de texto completo após a população completa inicial. Há uma pequena sobrecarga associada ao controle de alterações porque o SQL Server mantém uma tabela em que controla as alterações feitas na tabela base desde a última população. Quando é usado o controle de alterações, oSQL Server mantém um registro das linhas da tabela base ou exibição indexada que foram modificadas por atualizações, exclusões ou inserções. As alterações de dados por meio de WRITETEXT e UPDATETEXT não são refletidas no índice de texto completo e não são coletadas com o controle de alterações.

ObservaçãoObservação

Para tabelas que contêm uma coluna timestamp, você pode usar populações incrementais.

Quando o controle de alterações é habilitado durante a criação do índice, o SQL Server popula completamente o novo índice de texto completo logo após sua criação. Consequentemente, as alterações são controladas e propagadas para o índice de texto completo. Há dois tipos de controle de alterações: automático (opção CHANGE_TRACKING AUTO) e manual (opção CHANGE_TRACKING MANUAL). O controle de alterações automático é o comportamento padrão.

O tipo de controle de alterações determina como o índice de texto completo é populado, como segue:

  • População automática

    Por padrão, ou se você especificar CHANGE_TRACKING AUTO, o Mecanismo de Texto Completo usa população automática no índice de texto completo. Depois que a população completa inicial é concluída, as alterações são controladas à medida que os dados são modificados na tabela base, e as alterações controladas são propagadas automaticamente. O índice de texto completo é atualizado em segundo plano, mas as alterações propagadas podem não ser refletidas imediatamente no índice.

    Para configurar o controle de alterações com população automática

    Para obter mais informações, consulte o exemplo “E. Alterando um índice de texto completo para usar o controle de alterações automáticas”, mais adiante neste tópico.

  • População manual

    Se você especificar CHANGE_TRACKING MANUAL, o Mecanismo de Texto Completo usará população manual no índice de texto completo. Depois que a população completa inicial é concluída, as alterações são controladas à medida que os dados são modificados na tabela base. Porém, eles não serão propagados para o índice de texto completo até que você execute uma instrução ALTER FULLTEXT INDEX … START UPDATE POPULATION. É possível usar o SQL Server Agent para chamar essa instrução Transact-SQL periodicamente.

    Para começar a controlar alterações com população manual

    Para obter mais informações, consulte o exemplo “C. Criando um índice de texto completo com controle de alterações manual" e "D. Executando uma população manual", posteriormente neste tópico.

Para desativar o rastreamento de alterações

População incremental baseada em carimbo de data e hora

Uma população incremental é um mecanismo alternativo para popular um índice de texto completo manualmente. Você pode executar uma população incremental para um índice de texto completo que tem CHANGE_TRACKING definido como MANUAL ou OFF. Se a primeira população em um índice de texto completo for uma população incremental, ele indexará todas as linhas, tornando-a equivalente a uma população completa.

O requisito para população incremental é que a tabela indexada deve ter uma coluna do tipo de dados timestamp. Se uma coluna timestamp não existir, a população incremental não poderá ser executada. Uma solicitação para população incremental em uma tabela sem uma coluna timestamp resulta em uma operação de população completa. Além disso, se nenhum metadado que afeta o índice de texto completo da tabela foi alterado desde a última população, as solicitações de população incremental serão implementadas como populações completas. Isso inclui alterações de metadados geradas pela alteração de qualquer coluna, índice ou definições de índice de texto completo.

O SQL Server usa a coluna timestamp para identificar linhas que foram alteradas desde a última população. A população incremental então atualiza o índice de texto completo com linhas adicionadas, excluídas ou modificadas após a última população ou enquanto a última população estava em andamento. Se uma tabela tiver um volume alto de inserções, usar a população incremental poderá ser mais eficiente do que usar a população manual.

Ao término de uma população, o Mecanismo de Texto Completo registra um novo valor de timestamp. Esse valor é o maior valor de timestamp que o SQL Gatherer encontrou. Esse valor será usado quando uma população incremental subsequente for iniciada.

Para executar uma população incremental, execute uma instrução ALTER FULLTEXT INDEX usando a cláusula START INCREMENTAL POPULATION.

Para agendar um trabalho de população incremental

Exemplos

ObservaçãoObservação

Os exemplos desta seção usam a tabela Production.Document ou HumanResources.JobCandidate do banco de dados de exemplo AdventureWorks2008R2.

A. Criando um índice de texto completo sem executar uma população completa

O exemplo a seguir cria um índice de texto completo na tabela Production.Document do banco de dados de exemplo AdventureWorks2008R2. Este exemplo usa WITH CHANGE_TRACKING OFF, NO POPULATION para atrasar a população completa 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. Executando uma população completa em tabela

O exemplo a seguir executa uma população completa na tabela Production.Document do banco de dados de exemplo AdventureWorks2008R2.

ALTER FULLTEXT INDEX ON Production.Document
   START FULL POPULATION;

C. Criando um índice de texto completo com controle de alterações manuais

O exemplo a seguir cria um índice de texto completo que usará o controle de alterações com população manual na tabela HumanResources.JobCandidate do banco de dados de exemplo AdventureWorks2008R2.

USE AdventureWorks2008R2;
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. Executando uma população manual

O exemplo a seguir executa uma população manual no índice de texto completo com controle de alterações da tabela HumanResources.JobCandidate do banco de dados de exemplo AdventureWorks2008R2.

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

E. Alterando um índice de texto completo para usar o controle de alterações automáticas

O exemplo a seguir altera o índice de texto completo da tabela HumanResources.JobCandidate do banco de dados de exemplo AdventureWorks2008R2 para usar o controle de alterações com população automática.

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