Migliorare le prestazioni delle query full-textImprove the Performance of Full-Text Queries

Di seguito viene riportato un elenco di indicazioni che possono favorire il miglioramento delle prestazioni di esecuzione delle query full-text.The following is a list of recommendations that will help to improve the performance of full-text queries.

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.The performance of full-text queries is also influenced by hardware resources, such as memory, disk speed, CPU speed, and machine architecture.

  • Deframmentare l'indice della tabella di base tramite ALTER INDEX REORGANIZE.Defragment the index of the base table by using ALTER INDEX REORGANIZE.

  • Riorganizzare il catalogo full-text tramite ALTER FULLTEXT CATALOG REORGANIZE.Reorganize the full-text catalog by using 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.Make sure that you do this before performance testing because running this statement causes a master merge of the full-text indexes in that catalog.

  • Limitare la scelta delle colonne chiave full-text a una a colonna di dimensioni ridotte.Restrict your choice of full-text key columns to a small column. Benché le colonne a 900 byte siano supportate, è consigliabile utilizzare una colonna chiave di dimensioni inferiori per un indice full-text.Although a 900-byte column is supported, we recommend using a smaller key column in a full-text index. int e bigint garantiscono le prestazioni migliori.int and bigint provide the best performance.

  • L'uso di una chiave full-text a numero intero evita la creazione di un join con la tabella di mapping docid .Using an integer full-text key avoids a join with the docid mapping table. 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.Therefore, an integer full-text key improves query performance by an order of magnitude and improves crawl performance. Nel caso in cui la chiave full-text corrisponda anche alla chiave di indice cluster, i vantaggi a livello di prestazioni saranno ancora maggiori.Additional performance benefits might result if the full-text key is also the clustered index key.

  • Combinare più predicati CONTAINS in un unico predicato CONTAINS.Combine multiple CONTAINS predicates into one CONTAINS predicate. In SQL ServerSQL Server è possibile specificare un elenco di colonne nella query CONTAINS.In SQL ServerSQL Server you can specify a list of columns in the CONTAINS query.

  • Se sono necessarie solo informazioni sulla chiave full-text o sulla pertinenza, invece di CONTAINS o FREETEXT usare, rispettivamente, CONTAINSTABLE o FREETEXTTABLE .If you only require full-text key or rank information, use CONTAINSTABLE or FREETEXTTABLE instead of CONTAINS or FREETEXT, respectively.

  • Per limitare i risultati e ottimizzare le prestazioni, usare il parametro top_n_by_rank delle funzioni FREETEXTTABLE e CONTAINSTABLE.To limit results and increase performance, use the top_n_by_rank parameter of the FREETEXTTABLE and CONTAINSTABLE functions. top_n_by_rank consente di richiamare solo le occorrenze più attinenti.top_n_by_rank allows you to recall only the most relevant hits. Usare questo parametro solo se lo scenario aziendale non richiede il richiamo di tutte le occorrenze possibili, ovvero se non richiede il richiamo totale.Use this parameter only if your business scenario does not require recalling all possible hits (that is, it does not require total recall).

    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.Total recall is typically necessary for legal scenarios but might be less important than performance for business scenarios such as an e-business.

  • Controllare il piano di query full-text per verificare che venga scelto il piano di join appropriato.Check the full-text query plan to make sure that the appropriate join plan is chosen. Se necessario, utilizzare un hint di join o un hint per la query.Use a join hint or query hint if you have to. Se un parametro viene utilizzato nella query full-text, il valore utilizzato per la prima volta per il parametro determina il piano di query.If a parameter is used in the full-text query, the first-time value of the parameter determines the query plan. È possibile usare l' hint per la query OPTIMIZE FOR per forzare la compilazione della query con il valore voluto.You can use the OPTIMIZE FOR query hint to force the query to compile with the value you want. In questo modo è possibile ottenere un piano della query deterministico e prestazioni migliori.This helps achieve a deterministic query plan and better performance.

  • Un numero eccessivo di frammenti di indice full-text nell'indice full-text può causare una significativa riduzione delle prestazioni di esecuzione delle query.Too many full-text index fragments in the full-text index, can lead to substantial degradation in query performance. Per ridurre il numero di frammenti, riorganizzare il catalogo full-text tramite l'opzione REORGANIZE dell'istruzione ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL .To reduce the number of fragments, reorganize the full-text catalog by using the REORGANIZE option of the ALTER FULLTEXT CATALOG Transact-SQLTransact-SQL statement. 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.This statement essentially merges all the fragments into a single larger fragment and removes all obsolete entries from the full-text index.

  • 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.In full-text search, logical operators specified in CONTAINSTABLE (AND, OR) can be implemented either as SQL joins or inside the full-text execution streaming table-valued functions (STVF). 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.Typically, queries with only one type of logical operators are implemented purely by full-text execution, whereas queries that mix logical operators also possess SQL joins. 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.Implementation of a logical operator inside the full-text execution STVF uses some special index properties that make it much faster than SQL joins. Per questo motivo, è consigliabile, se possibile, definire le query utilizzando un solo tipo di operatore logico.For this reason, we recommend that, where possible, you frame queries using only a single type of logical operator.

  • 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.For applications that contain selective-relation predications, queries that use selective relational predicates and unselective full-text predicates might perform best when they are written to use the 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.This allows the query optimizer to decide whether it can exploit predicate or range pushdown to produce an effective query plan. Questo metodo è più semplice e spesso più efficiente rispetto all'indicizzazione di dati relazionali come dati full-text.This approach is simpler and often more efficient than indexing relational data as full-text data.

SQL Server 2008 Full-Text Search: Internals and EnhancementsSQL Server 2008 Full-Text Search: Internals and Enhancements

Vedere ancheSee Also

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