Migliorare le prestazioni 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.
Le prestazioni di esecuzione delle query full-text possono dipendere inoltre da risorse hardware quali memoria, velocità del disco e della CPU, nonché dall'architettura del computer.
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 delle colonne chiave full-text a una a colonna di dimensioni ridotte. Benché le colonne a 900 byte siano supportate, è consigliabile utilizzare una colonna chiave di dimensioni inferiori per un indice full-text. int e bigint forniscono le migliori prestazioni.
L'utilizzo di una chiave full-text di tipo integer evita la creazione di un join con la tabella di mapping docid. Una chiave full-text di tipo integer, pertanto, consente di migliorare le prestazioni di esecuzione delle query di un ordine di grandezza e le prestazioni della ricerca per indicizzazione. Nel caso in cui la chiave full-text corrisponda anche alla chiave di indice cluster, i vantaggi a livello di prestazioni saranno ancora maggiori.
Combinare più predicati CONTAINS in un singolo 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 ottimizzare le prestazioni, utilizzare il parametro top_n_by_rank delle funzioni FREETEXTTABLE e CONTAINSTABLE. top_n_by_rank consente di richiamare solo le occorrenze più attinenti. Utilizzare questo parametro solo se lo scenario aziendale non richiede il richiamo di tutte le possibili occorrenze, ovvero non richiede il richiamo totale.
[!NOTA]
Il richiamo totale è in genere necessario per gli scenari legali, ma potrebbe essere meno importante delle prestazioni per altri scenari, ad esempio il commercio elettronico.
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 forzare la compilazione della query con il valore desiderato. In questo modo è possibile ottenere un piano della query deterministico e prestazioni migliori.
Un numero eccessivo di frammenti di indice full-text nell'indice full-text può causare una significativa riduzione delle prestazioni di esecuzione delle query. Per ridurre il numero di frammenti, riorganizzare il catalogo full-text tramite l'opzione REORGANIZE dell'istruzione ALTER FULLTEXT CATALOG Transact-SQL. Questa istruzione consente di unire tutti i frammenti in un singolo frammento più grande e di rimuovere tutte le voci obsolete dall'indice full-text.
Nelle ricerche full-text gli operatori logici specificati in CONTAINSTABLE (AND, OR) possono essere implementati come join SQL o all'interno di funzioni di flusso con valori di tabella per l'esecuzione full-text. Le query con un solo tipo di operatori logici vengono in genere implementate dall'esecuzione full-text, mentre le query con operatori logici di più tipi presentano anche join SQL. L'implementazione di un operatore logico all'interno della funzione con valori di tabella per l'esecuzione full-text prevede l'utilizzo di alcune proprietà di indice speciali che ne migliorano la velocità rispetto ai join SQL. Per questo motivo, è consigliabile, se possibile, definire le query utilizzando un solo tipo di operatore logico.
Per le applicazioni che contengono affermazioni a relazione selettiva, le prestazioni di esecuzione delle query che utilizzano predicati relazionali selettivi e predicati full-text non selettivi potrebbero risultare migliori se le query sono scritte per l'utilizzo di Query Optimizer. In questo modo, Query Optimizer sarà in grado di stabilire la possibilità o meno di utilizzare l'impostazione di intervalli o di predicati per produrre un piano di query efficace. Questo metodo è più semplice e spesso più efficiente rispetto all'indicizzazione di dati relazionali come dati full-text.
Risorse correlate
SQL Server 2008 Full-Text Search: Internals and Enhancements