Ottimizzazione delle prestazioni (ricerca full-text)

Data aggiornamento: 14 aprile 2006

Le prestazioni per l'indicizzazione e le query full-text sono influenzate da risorse hardware, ad esempio memoria e velocità del disco e della CPU.

Prestazioni dell'indicizzazione full-text

La causa principale della riduzione delle prestazoni dell'indicizzazione full-text è data dai limiti delle risorse hardware:

  • Se l'utilizzo della CPU da parte del servizio MSFTESQL e di SQL Server è vicino al 100%, la CPU è il collo di bottiglia.
  • Se la lunghezza media della coda di attesa del disco è superiore al doppio del numero di testine, è presente un collo di bottiglia nel disco. La soluzione alternativa principale consiste nella creazione di cataloghi full-text separati dai file e dai log del database di SQL Server. Posizionare i log, i file di database e i cataloghi full-text su dischi separati. Per migliorare le prestazioni di indicizzazione è inoltre possibile acquistare dischi più veloci e utilizzare RAID.
  • Se la quantità di memoria fisica non è sufficiente (limite di 3 GB) e nel log di tipo ricerca per indicizzazione viene visualizzato il messaggio di sospensione del servizio, il collo di bottiglia è costituito dalla memoria. Per informazioni sulle procedure per la risoluzione di questo problema, vedere Sospensione del servizio Microsoft Full-Text Engine for SQL Server (MSFTESQL). Il servizio MSFTESQL non supporta la modalità AWE. L'aggiunta di una quantità di memoria superiore a 4 GB favorisce esclusivamente SQL Server.

Se nel sistema non si riscontrano colli di bottiglia hardware, è possibile ottimizzare il sistema per aumentare la capacità hardware. Quando non sono presenti colli di bottiglia hardware, le prestazioni di indicizzazione della ricerca full-text in Microsoft SQL Server 2005 dipendono principalmente dagli elementi indicati di seguito.

  • Tempo richiesto da SQL Server per la creazione di batch full-text.
  • Velocità di utilizzo di questi batch da parte del servizio MSFTESQL.

Per ottenere prestazioni ottimali è necessario ottimizzare l'interazione tra SQL Server e il servizio MSFTESQL. Se SQL Server produce più batch di quelli che il servizio MSFTESQL è in grado di utilizzare, il servizio verrà sospeso e verrà generato un messaggio del log di tipo ricerca per indicizzazione per indicare lo stato di sospensione. Per informazioni sulle procedure per la risoluzione di questo problema, vedere Sospensione del servizio Microsoft Full-Text Engine for SQL Server (MSFTESQL).

Se, al contrario, SQL Server non produce batch full-text in quantità sufficiente per tenere occupato il servizio MSFTESQL, il servizio è inattivo. Questa non è una condizione ottimale e costituisce uno dei motivi più comuni dell'esecuzione lenta dell'indicizzazione. Per verificare che il servizio MSFTESQL sia occupato in modo ottimale, è necessario tenere traccia e ottimizzare i contatori seguenti:

  • Batch in corso: Microsoft Full-Text Engine Filter Daemon (MSFTELFD)
    Questo contatore deve essere uguale o pari al doppio del numero di CPU del sistema. I valori 0, 1 o 2 con un basso utilizzo della CPU indicano che le prestazioni di SQL Server non sono ottimali. Con un computer a quattro vie, ad esempio, questo numero deve essere compreso tra 4 e 8.
  • Batch pronti in coda: servizio MSFTESQL.

Il valore deve essere prossimo a dieci volte il conteggio dell'intervallo di ricerca per indicizzazione. Per determinare quanti intervalli vengono utilizzati per indicizzare la tabella, eseguire una query da sys.dm_fts_population_ranges.

Se il contatore risulta lento, è possibile migliorarne le prestazioni nei modi seguenti:

  • Verificare che la tabella disponga di un intervallo a più ricerche per indicizzazione. A tale scopo, eseguire una query in sys.dm_fts_population_ranges. In linea teorica, il conteggio dell'intervallo di ricerca per indicizzazione deve corrispondere al doppio del numero di CPU. L'intervallo a più ricerche per indicizzazione è limitato dal numero di righe nella tabella, dal numero di CPU e dall'opzione di configurazione max full-text crawl range. Per rendere effettiva questa opzione, è necessario riavviare l'operazione di ricerca per indicizzazione.

    [!NOTA] Questo si applica solo a una ricerca per indicizzazione completa.

  • Verificare che la tabella di base includa un indice cluster. Utilizzare un tipo di dati integer per la prima colonna dell'indice cluster. Evitare l'utilizzo di GUID nella prima colonna dell'indice cluster. Un intervallo a più ricerche per indicizzazione in un indice cluster garantisce la massima velocità di ricerca per indicizzazione.

  • Aggiornare le statistiche della tabella di base utilizzando l'istruzione UPDATE STATISTICS. Un'operazione ancora più importante consiste nell'aggiornamento delle statistiche nell'indice cluster o della chiave full-text per una ricerca per indicizzazione completa. Questa operazione favorisce la creazione di partizioni efficaci nella tabella da parte di un intervallo a più ricerche per indicizzazione.

  • Generare un indice secondario in una colonna timestamp se si desidera migliorare le prestazioni del popolamento incrementale.

[!NOTA] A differenza di una ricerca per indicizzazione completa, i popolamenti incrementale, manuale e con rilevamento automatico delle modifiche non sono progettati per ottimizzare le risorse hardware al fine di raggiungere una velocità più elevata. Di conseguenza, questi suggerimenti di ottimizzazione potrebbero non migliorare le prestazioni per l'indicizzazione full-text.

Indicazioni per migliorare le prestazioni di esecuzione delle query full-text

Di seguito viene riportato un elenco di indicazioni che possono favorire il miglioramento delle prestazioni di esecuzione delle query full-text.

  • Deframmentare l'indice della tabella di base utilizzando ALTER INDEX REORGANIZE.
  • Riorganizzare il catalogo full-text utilizzando ALTER FULLTEXT CATALOG REORGANIZE. È necessario eseguire queste operazioni prima del test delle prestazioni poiché l'esecuzione di questa istruzione determina un'unione nell'indice master degli indici full-text in tale catalogo.
  • Limitare la scelta di colonne chiave full-text a una a colonna di piccole dimensioni. Sebbene venga supportata una colonna da 900 byte, non è consigliabile generare un indice full-text che utilizza una colonna chiave di queste dimensioni.
  • Combinare più predicati CONTAINS in un predicato CONTAINS. In SQL Server è possibile specificare un elenco di colonne nella query CONTAINS.
  • Se sono necessarie solo informazioni sulla chiave full-text o sulla pertinenza, utilizzare CONTAINSTABLE o FREETEXTTABLE invece di CONTAINS o FREETEXT, rispettivamente.
  • Per limitare i risultati e migliorare le prestazioni, utilizzare l'opzione TOP_N_BY_RANK della sintassi FREETEXTTABLE e CONTAINSTABLE. Questa opzione deve essere utilizzata se non si è interessati a tutti i risultati possibili.
  • Controllare il piano di query full-text per verificare che venga scelto il piano di join appropriato. Se necessario, utilizzare un hint di join o un hint per la query. Se un parametro viene utilizzato nella query full-text, il valore utilizzato per la prima volta per il parametro determina il piano di query. È possibile utilizzare l'hint per la query OPTIMIZE FOR per imporre la compilazione della query con il valore desiderato. In questo modo è possibile ottenere un piano di query deterministico e prestazioni migliori.

Vedere anche

Concetti

Amministrazione della ricerca full-text

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

14 aprile 2006

Contenuto modificato:
  • Revisione significativa dei suggerimenti per l'ottimizzazione delle prestazioni.