Popolamento degli indici a testo completo
Si applica a:SQL Server
Database SQL di Azure
Istanza gestita di SQL di Azure
La creazione e la gestione di un indice full-text comporta il popolamento dell'indice, con un processo chiamato popolamento (noto anche come ricerca per indicizzazione).
Tipi di popolamento
Un indice full-text supporta i tipi di popolamento seguenti:
- Popolazione completa
- Popolamento automatico o manuale basato sul rilevamento delle modifiche
- Popolamento incrementale basato su marca temporale
Popolamento completo
Durante un popolamento completo, vengono create voci di indice per tutte le righe di una tabella o di una vista indicizzata. Durante un popolamento completo di un indice full-text, vengono create entrate di indice per tutte le righe della tabella di base o della vista indicizzata.
Per impostazione predefinita, in SQL Server un nuovo indice full-text viene popolato completamente non appena viene creato.
- D'altra parte un popolamento completo può richiedere una quantità significativa di risorse. Di conseguenza, quando si crea un indice full-text durante periodi di intensa attività è spesso consigliabile rimandare il popolamento completo a un periodo di attività meno intensa, in particolare se la tabella di base di un indice full-text è di grandi dimensioni.
- Tuttavia, il catalogo full-text a cui appartiene l'indice non può essere usato finché non vengono popolati tutti i relativi indici full-text.
Per creare un indice full-text senza popolarlo immediatamente, specificare la clausola CHANGE_TRACKING OFF, NO POPULATION
nell'istruzione CREATE FULLTEXT INDEX
. Se si specifica CHANGE_TRACKING MANUAL
, il motore di ricerca full-text non popola il nuovo indice full-text finché non viene eseguita l'istruzione ALTER FULLTEXT INDEX
usando la clausola START FULL POPULATION
o START INCREMENTAL POPULATION
.
Esempio: creare un indice full-text senza eseguire un popolamento completo
Nell'esempio seguente viene creato un indice full-text nella tabella Production.Document
del database di esempio AdventureWorks
. Questo esempio usa WITH CHANGE_TRACKING OFF, NO POPULATION
per ritardare il popolamento completo iniziale.
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
Esempio: eseguire un popolamento completo in una tabella
Nell'esempio seguente viene eseguito un popolamento completo nella tabella Production.Document
del database di esempio AdventureWorks
.
ALTER FULLTEXT INDEX ON Production.Document
START FULL POPULATION;
Popolamento basato sul rilevamento delle modifiche
Facoltativamente, è possibile utilizzare il rilevamento delle modifiche per gestire un indice full-text dopo il popolamento completo iniziale. Al rilevamento delle modifiche è associato un piccolo overhead perché in SQL Server è presente una tabella nella quale vengono rilevate le modifiche apportate alla tabella di base dopo l'ultimo popolamento. Quando usi il rilevamento delle modifiche, in SQL Server viene mantenuto un record delle righe della tabella di base o della vista indicizzata modificate tramite aggiornamenti, eliminazioni o inserimenti. Le modifiche apportate ai dati tramite WRITETEXT e UPDATETEXT non vengono riflesse nell'indice full-text e pertanto non vengono registrate dalla funzione di rilevamento delle modifiche.
Nota
Per le tabelle che contengono una colonna timestamp , è possibile usare il popolamento incrementale anziché il rilevamento delle modifiche.
Quando abiliti il rilevamento delle modifiche durante la creazione dell'indice, SQL Server esegue il popolamento completo del nuovo indice full-text subito dopo la creazione. Le modifiche vengono quindi rilevate e propagate all'indice full-text.
Abilita rilevamento modifiche
Esistono due tipi di rilevamento delle modifiche:
- Automatico (opzione
CHANGE_TRACKING AUTO
). Il rilevamento delle modifiche automatico è il comportamento predefinito. - Manuale (opzione
CHANGE_TRACKING MANUAL
).
La modalità di popolamento dell'indice full-text dipende dal tipo di rilevamento delle modifiche:
Popolamento automatico
Per impostazione predefinita o se si specifica
CHANGE_TRACKING AUTO
, il motore di ricerca full-text usa il popolamento automatico per l'indice full-text. Al termine del popolamento completo iniziale, le modifiche vengono rilevate man mano che i dati vengono modificati nella tabella di base e le modifiche rilevate vengono propagate automaticamente. L'indice full-text viene aggiornato in background, pertanto le modifiche propagate potrebbero non venire riflesse immediatamente nell'indice.Per avviare il rilevamento delle modifiche con il popolamento automatico
CREATE FULLTEXT INDEX ... CON TRACCIAMENTO_CAMBIAMENTI AUTO
ALTER FULLTEXT INDEX ... SET CHANGE_TRACKING AUTO
Esempio: modificare un indice full-text per usare il rilevamento automatico delle modifiche
Nell'esempio seguente viene modificato l'indice di testo completo della tabellaHumanResources.JobCandidate
del database di esempioAdventureWorks
per utilizzare il rilevamento delle modifiche con il popolamento automatico.USE AdventureWorks; GO ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO; GO
Popolamento manuale
Se si specifica CHANGE_TRACKING MANUAL, il motore di ricerca full-text utilizza il popolamento manuale per l'indice full-text. Al termine del popolamento completo iniziale, le modifiche vengono rilevate man mano che i dati vengono modificati nella tabella di base. Tuttavia, non vengono propagate nell'indice full-text finché non si esegue un'istruzione ALTER FULLTEXT INDEX... START UPDATE POPULATION. Per chiamare periodicamente questa istruzione Transact-SQL, è possibile usare SQL Server Agent.
Per avviare il rilevamento delle modifiche con il popolamento manuale
CREATE FULLTEXT INDEX ... CON TRACCIAMENTO_DELLE_MODIFICHE MANUALE
ALTER FULLTEXT INDEX ... IMPOSTA TRACCIAMENTO DELLE MODIFICHE SU MANUALE
Esempio: creare un indice full-text con il rilevamento delle modifiche manuale
Nell'esempio seguente viene creato un indice full-text che utilizzerà il rilevamento delle modifiche con popolamento manuale nella tabellaHumanResources.JobCandidate
del database di esempioAdventureWorks
.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
Esempio: eseguire un popolamento manuale
Nell'esempio seguente, viene eseguita una popolazione manuale sull'indice full-text con tracciamento delle modifiche della tabellaHumanResources.JobCandidate
del database di esempioAdventureWorks
.USE AdventureWorks; GO ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION; GO
Disabilitare il rilevamento delle modifiche
CREA INDICE FULLTEXT ... CON TRACCIAMENTO_CAMBIAMENTI DISATTIVATO
ALTER FULLTEXT INDEX ... IMPOSTA CAMBIO_TRACCIAMENTO DISATTIVO
Popolamento incrementale basato su un timestamp
Un popolamento incrementale è un meccanismo alternativo per il popolamento manuale di un indice full-text. Se in una tabella vengono eseguiti molti inserimenti, l'utilizzo del popolamento incrementale può rivelarsi più efficiente dell'utilizzo del popolamento manuale.
È possibile eseguire un popolamento incrementale per un indice full-text per il quale CHANGE_TRACKING è impostato su MANUAL o OFF.
Per eseguire il popolamento incrementale, è necessario che la tabella indicizzata contenga una colonna del tipo di dati timestamp . Se non è disponibile una colonna timestamp , il popolamento incrementale non può essere eseguito.
SQL Server usa la colonna timestamp per identificare le righe che sono state modificate dopo l'ultimo popolamento. Il popolamento incrementale aggiorna l'indice full-text per le righe aggiunte, eliminate o modificate dopo l'ultimo popolamento o mentre quest'ultimo era in corso. Al termine di un popolamento, il motore full-text registra un nuovo valore timestamp. che corrisponde al valore timestamp maggiore rilevato da SQL Gatherer. Questo valore verrà usato all'avvio del successivo popolamento incrementale.
In alcuni casi una richiesta di popolamento incrementale comporta un popolamento completo.
- Se viene richiesto un popolamento incrementale per una tabella senza una colonna timestamp , verrà eseguito un popolamento completo.
- Se il primo popolamento di un indice full-text è incrementale, vengono indicizzate tutte le righe e il risultato è equivalente a un popolamento completo.
- Se alcuni metadati che interessano l'indice full-text della tabella sono stati modificati dall'ultimo popolamento, le richieste di popolamento incrementale vengono trattate come popolamenti completi. Sono incluse le modifiche ai metadati causate dall'alterazione di qualsiasi definizione di colonna, indice o indice full-text.
Eseguire un popolamento incrementale
Per eseguire un popolamento incrementale, eseguire un'istruzione ALTER FULLTEXT INDEX
usando la clausola START INCREMENTAL POPULATION
.
Creare o modificare una pianificazione per un popolamento incrementale
In Management Studio espandere il server in Esplora oggetti.
Espandi Database e poi espandi il database contenente l'indice full-text.
Espandere Tabelle.
Fare clic con il pulsante destro del mouse sulla tabella in cui è definito l'indice full-text, selezionare Indice full-text e nel menu di scelta rapida Indice full-text, fare clic su Proprietà. Verrà visualizzata la finestra di dialogo Proprietà indice full-text .
Importante
Se la tabella o la vista di base non contiene una colonna di dati di tipo timestamp, non è possibile eseguire un popolamento incrementale.
Nel riquadro Seleziona una pagina selezionare Pianificazioni.
Utilizzare questa pagina per creare o gestire le pianificazioni per un processo di SQL Server Agent che consente di avviare un popolamento incrementale della tabella di base o della vista indicizzata dell'indice full-text.
Le opzioni sono le seguenti:
Per creare una nuova pianificazione, fare clic su Nuova.
Verrà visualizzata la finestra di dialogo Nuova pianificazione della tabella di indicizzazione di testo completo, dove puoi creare una pianificazione. Per salvare la pianificazione, fare clic su OK.
Importante
Un processo di SQL Server Agent (Start Incremental Table Population on database_name.table_name) viene associato a una nuova pianificazione dopo che esci dalla finestra di dialogo Proprietà indice full-text. Se vengono create più pianificazioni per lo stesso indice full-text, tutte usano lo stesso processo.
Per modificare una pianificazione esistente, selezionare la pianificazione esistente e quindi fare clic su Modifica.
Verrà visualizzata la finestra di dialogo Nuova pianificazione tabella indicizzazione full-text in cui è possibile modificare la pianificazione.
Nota
Per informazioni sulla modifica di un processo di SQL Server Agent, vedere Modificare un processo.
Per rimuovere una pianificazione esistente, selezionare la pianificazione esistente e quindi fare clic su Elimina.
Seleziona OK.
Risoluzione dei problemi relativi agli errori in un popolamento full-text (ricerca per indicizzazione)
Quando si verifica un errore durante una ricerca per indicizzazione, la funzionalità di registrazione della ricerca full-text crea e gestisce un log di ricerca per indicizzazione in un file di testo semplice. Ogni registro di scansione corrisponde a un catalogo di testo completo specifico. Per impostazione predefinita, i log di indicizzazione per un'istanza specifica, come ad esempio l'istanza predefinita, si trovano nella cartella %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG
.
Il file di log di crawl segue il seguente schema di denominazione.
SQLFT<DatabaseID><FullTextCatalogID>.LOG[<n>]
Di seguito sono riportate le parti variabili del nome del file del log di crawling.
- < DatabaseID>: l’ID di un database. < dbid> è un numero a cinque cifre con zeri iniziali.
- < FullTextCatalogID>: l'ID del catalogo di testo completo. < catid> è un numero a cinque cifre con zeri iniziali.
- < n> - È un numero intero che indica l'esistenza di uno o più log di ricerca per indicizzazione per lo stesso catalogo full-text.
Ad esempio, SQLFT0000500008.2
è il file del log di ricerca per indicizzazione per un database con ID database = 5 e ID catalogo full-text = 8. Il 2 alla fine del nome del file indica che sono presenti due file di log di scansione per questa coppia di database/catalogo.
Vedi anche
sys.dm_fts_index_population (Transact-SQL)
Inizia a utilizzare la ricerca full-text
Creazione e gestione di indici full-text
CREATE FULLTEXT INDEX (Transact-SQL)
ALTER FULLTEXT INDEX (Transact-SQL)