Migliorare le prestazioni delle query full-text in SQL Server

Traduzione articoli Traduzione articoli
Identificativo articolo: 2549443 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

Sommario

In questo articolo viene descritto un metodo per migliorare le prestazioni delle query di Microsoft SQL Server che utilizzano i predicati di ricerca full-text (ad esempio, contiene e CONTAINSTABLE) e che inoltre filtrare i dati. Ad esempio, questo metodo migliora le prestazioni delle query riportata di seguito:
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
Questo metodo consente di Progettazione query, lo schema di tabella e indice full-text in modo che il motore di ricerca full-text Filtra i risultati prima che vengano inviati al motore relazionale. Pertanto, non è necessario che il motore relazionale filtro dataset di grandi dimensioni.

Informazioni

Quando si crea una query di ricerca full-text, il fattore di principio che influisce sulle prestazioni della query sono la quantità di dati che il motore di ricerca full-text deve elaborare prima i restanti dati vengono inviati al motore relazionale. In SQL Server, è possibile migliorare le prestazioni delle query filtrando le righe prima di ridurre il numero di righe che devono essere elaborati in un secondo momento.

Nelle versioni di SQL Server che sono state rilasciate prima di SQL Server 2008, il motore di ricerca full-text restituisce tutte le righe che corrispondono a un termine di ricerca e quindi il motore relazionale viene applicato alcun filtro. In SQL Server 2008, SQL Server 2008 R2 e SQL Server 2012, sono stati apportati miglioramenti a questo comportamento. Tuttavia, è difficile utilizzare questi miglioramenti, poiché gli indici di ricerca full-text sono organizzati in modo molto diverso da indici del database. Inoltre, il motore di ricerca full-text e il motore relazionale funziona in modo molto diverso. Di conseguenza, il metodo descritto in questo articolo utilizza la funzione Table-Valued (TVF) per filtrare le righe all'inizio e di ridurre il numero di righe che devono essere elaborati in un secondo momento.

Ad esempio, il piano di query seguente restituisce 131051 righe che corrispondono a una stringa di ricerca CONTAINS. Inoltre, un operatore di join nel piano esegue altre opzioni di filtro utilizzando una ricerca nell'indice.
Rows StmtText 
-------------------- -----------------------------------------------------------------------------------------------------------
1167 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate> '08/05/2019' 

1167 |--Merge Join(Left Semi Join, MERGE:([FTSdb].[dbo].[fttest].[ID])=(FulltextMatch.[docid]), RESIDUA
5858 |--Sort(ORDER BY:([FTSdb].[dbo].[fttest].[ID] ASC)) 
5858 | |--Clustered Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[clidx1]), SEEK:([FTSdb].[
131051 |--Table-valued function 
Tuttavia, se la query include la colonna chiave full-text di indice univoco come predicato, il motore di ricerca full-text può utilizzare il predicato per filtrare i risultati a livello di full-text. In questo caso, la TVF restituisce una piccola quantità di dati prima di altre opzioni di filtro deve essere applicato. Ad esempio, la query seguente specifica cinque valori che devono soddisfare la condizione di c2 e la TVF restituisce solo i risultati che corrispondono ai cinque valori:
Rows StmtText 

-------- ---------------------------------------------------------------------------------------------------------------------------------
5 select CDate, ID from dbo.fttest where contains (c2, '"create"') and CDate > '08/05/2019' and ID in ( 654051, 644051, 649106, 465, 105)

5 |--Nested Loops(Left Semi Join, OUTER REFERENCES:([FTSdb].[dbo].[fttest].[ID])) 
5 |--Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[idx1]), SEEK:([FTSdb].[dbo].[fttest].[ID]=(105) OR ...
5 |--Table-valued function
Capacità del motore di ricerca full-text per ridurre i valori che vengono utilizzati dalla chiave di indice univoco è la base del metodo seguente.

Se un predicato contiene una colonna di tipo Data/ora, è possibile includere informazioni sulla data nella colonna della chiave di indice univoco in modo che solo le righe che corrispondono al predicato vengono emessi. A tale scopo, è necessario includere in modo logico le informazioni sulla data nella colonna della chiave. Tuttavia, è necessario anche modificare il tipo di dati di colonna di chiave e le applicazioni che utilizzano la query.

Per implementare il metodo, modificare il tipo di dati di full-text unique key ID bigint. I primi 4 byte dell'acquisizione di ID chiave anno, mese e i valori di data nella colonna data e gli ultimi 4 byte rimangono invariati. Ad esempio, il primo byte della chiave che ID potrebbe fare riferimento all'anno, il byte successivo potrebbe fare riferimento al mese e gli ultimi due byte potrebbe fare riferimento alla data. L'applicazione deve supportare la modifica del tipo di dati.

Quindi, tradurre un predicato di intervallo a un predicato per la chiave ID. Ad esempio, "x<>< y"="" range="" predicate="" can="" be="" translated="" to="" the="" "(x*2^32="">< id="">< y*2^32)"="" predicate.="" because="" the="" translated="" predicate="" is="" a="" predicate="" on="" the="" full-text="" key,="" the="" predicate="" will="" be="" pushed="" down="" into="" the="" full-text="" streaming="" table-valued="" functions="" (stvf).="" this="" behavior="" effectively="" performs="" searches="" within="" the="" date="">

Proprietà

Identificativo articolo: 2549443 - Ultima modifica: venerdì 22 marzo 2013 - Revisione: 2.0
Le informazioni in questo articolo si applicano a:
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Enterprise Evaluation
  • Microsoft SQL Server 2008 R2 Datacenter
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 R2 Enterprise
  • Microsoft SQL Server 2008 R2 Standard
  • Microsoft SQL Server 2012 Developer
  • Microsoft SQL Server 2012 Standard
  • Microsoft SQL Server 2012 Web
  • Microsoft SQL Server 2012 Enterprise
Chiavi: 
kbmt KB2549443 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 2549443
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com