Migliorare le prestazioni delle query Full-Text

Di seguito è riportato un elenco di raccomandazioni che consentono di migliorare le prestazioni delle query full-text.

Le prestazioni delle query full-text sono influenzate anche dalle risorse hardware, ad esempio memoria, velocità del disco, velocità della CPU e architettura del computer.

  • Deframmentare l'indice della tabella di base usando ALTER INDEX REORGANIZE.

  • Riorganizzare il catalogo full-text usando ALTER FULLTEXT CATALOG REORGANIZE. Assicurati di eseguire questa operazione prima del test delle prestazioni, perché l'esecuzione di questa istruzione provoca un'unione principale degli indici full-text in quel catalogo.

  • Limitare la scelta delle colonne chiave full-text a una colonna di piccole dimensioni. Sebbene sia supportata una colonna a 900 byte, è consigliabile usare una colonna chiave più piccola in un indice full-text. int e bigint offrono prestazioni ottimali.

  • L'uso di una chiave intera di testo completo consente di evitare di eseguire un join con la tabella di mapping docid. Pertanto, una chiave di testo integrale migliora le prestazioni delle query di un ordine di grandezza e migliora le prestazioni di indicizzazione. Se la chiave full-text è anche la chiave di indice cluster, possono risultare vantaggi aggiuntivi per le prestazioni.

  • 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 sul rango, usare CONTAINSTABLE o FREETEXTTABLE rispettivamente anziché CONTAINS o FREETEXT.

  • Per limitare i risultati e migliorare le prestazioni, usare il parametro top_n_by_rank delle funzioni FREETEXTTABLE e CONTAINSTABLE. top_n_by_rank consente di ricordare solo i risultati più rilevanti. Usare questo parametro solo se lo scenario aziendale non richiede il richiamo di tutti i riscontri possibili, ovvero non richiede il richiamo totale.

    Annotazioni

    Il richiamo totale è in genere necessario per gli scenari legali, ma potrebbe essere meno importante delle prestazioni per scenari aziendali, come un'azienda online.

  • Controllare il piano delle query full-text per verificare che venga scelto il piano di join appropriato. Se hai bisogno, usa un suggerimento di join o un suggerimento per la query. Se nella query full-text viene utilizzato un parametro, il primo valore del parametro determina il piano di query. È possibile utilizzare il query hint OPTIMIZE FOR per forzare la compilazione della query con il valore desiderato. Ciò consente di ottenere un piano di query deterministico e prestazioni migliori.

  • Troppi frammenti di indice full-text nell'indice full-text possono causare una riduzione sostanziale delle prestazioni delle query. Per ridurre il numero di frammenti, riorganizzare il catalogo full-text usando l'opzione REORGANIZE dell'istruzione ALTER FULLTEXT CATALOGTransact-SQL. Questa istruzione essenzialmente unisce tutti i frammenti in un singolo frammento più grande e rimuove tutte le voci obsolete dall'indice full-text.

  • Nella ricerca full-text, gli operatori logici specificati in CONTAINSTABLE (AND, OR) possono essere implementati come join SQL o all'interno delle funzioni stVF (Full-Text Execution Streaming Table Valued Functions). In genere, le query con un solo tipo di operatori logici vengono implementate esclusivamente dall'esecuzione full-text, mentre le query che combinano operatori logici possiedono anche join SQL. L'implementazione di un operatore logico all'interno dell'esecuzione full-text STVF usa alcune proprietà di indice speciali che lo rendono molto più veloce rispetto ai join SQL. Per questo motivo, è consigliabile, se possibile, eseguire il frame delle query usando un solo tipo di operatore logico.

  • Per le applicazioni che contengono predicati di relazione selettiva, le query che usano predicati relazionali selettivi e predicati full-text non selezionati possono risultare ottimali quando vengono scritte per l'uso di Query Optimizer. Ciò consente all'ottimizzatore delle query di decidere se può sfruttare il pushdown dei predicati o degli intervalli per produrre un piano di query efficace. Questo approccio è più semplice e spesso più efficiente rispetto all'indicizzazione dei dati relazionali come dati full-text.

Ricerca Testuale Completa di SQL Server 2008: Interni e Miglioramenti

Vedere anche

sys.dm_fts_memory_buffers (Transact-SQL)
sys.dm_fts_memory_pools (Transact-SQL)