Îmbunătăți performanța de interogări text integral în SQL Server

Traduceri articole Traduceri articole
ID articol: 2549443 - View products that this article applies to.
Măriți totul | Reduceți totul

Rezumat

Acest articol descrie o metodă pentru a îmbunătă?i performan?ele interogărilor Microsoft SQL Server care utilizează predicate de căutare în text complet (precum conține și CONTAINSTABLE) și, de asemenea, că filtrarea datelor. De exemplu, această metodă îmbunătățește performanța de următoarea interogare:
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
Această metodă vă permite să proiectarea interogării, tabel scheme și index text complet într-un mod că motorul de căutare în text complet le filtrează rezultatele înainte sunt trimise la motorul relationale. Prin urmare, relaționale motorul nu are pentru a filtra un set mare acoperire de date.

Informații suplimentare

Când creați o interogare de căutare în text complet, factorul de principiu că afectează performanța de interogare este cantitatea acoperire de date pe care motorul de căutare în text complet trebuie să prelucreze înainte de restul datele sunt trimise la motorul relationale. În SQL Server, poate îmbunătăți performanțele interogării prin filtrarea rândurilor devreme pentru a reduce numărul de rânduri pe care trebuie să fie prelucrate ulterior.

În versiunile de SQL Server care au fost lansate înainte de SQL Server 2008, motor de căutare în text complet întoarce toate rândurile care se potrivesc cu un termen de căutare, și apoi motorul relationale se aplică filtre. Îmbunătățiri la acest comportament au fost făcute în SQL Server 2008, SQL Server 2008 R2 și SQL Server 2012. Cu toate acestea, este dificil de a folosi aceste îmbunătățiri pentru că indexurile de căutare în text complet sunt organizate foarte diferit de la indicii de bază acoperire de date. În plus, motorul de căutare în text complet și relaționale motorul funcționează foarte diferit. Prin urmare, metoda descrisă în acest articol folosește funcția Table-Valued (TVF) pentru a filtra rânduri la începutul anului și pentru a reduce numărul de rânduri pe care trebuie să fie prelucrate ulterior.

De exemplu, următorul plan de interogare returnează rânduri 131051 care se potrivesc cu un șir de căutare conține. În plus, un operator de unire în plan efectuează filtrare suplimentare utilizând o căutare index.
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 
Cu toate acestea, dacă interogarea include coloana cheie index text complet unic ca un predicat, motorul de căutare în text complet poate Predicatul să filtrați rezultatele la nivel de text complet. În această situație, TVF întoarce o sumă mult mai mică acoperire de date înainte de filtrare suplimentare trebuie să fie aplicate. De exemplu, următoarea interogare specifică cinci valori care trebuie să corespundă stării c2 și TVF întoarce numai acele rezultate care se potrivesc cu cinci 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
Motor de căutare în text complet capacitatea de a împinge în jos de valori care sunt utilizate de cheie index unic este baza de următoarea metodă.

Dacă un predicat con?ine o coloană de tip acoperire de date DateTime, pot include informații actualizate în coloana cheie index unic astfel încât se emit numai rândurile care se potrivesc cu acest predicat. Pentru aceasta, trebuie să includă în mod logic informații actualizate în coloana cheie. Cu toate acestea, de asemenea, trebuie să modificați tipul acoperire de date coloană cheie și aplicațiile care utilizează interogarea.

Pentru a pune în aplicare metoda, schimbarea tipului acoperire de date al full-text unic ID pentru BIGINT-cheie. Primul 4 octeți de captare ID cheie anul, luna ?i data valorile din coloana data ?i ultimul 4 octeți rămân aceleași. De exemplu, primul octet de ID cheie ar putea referi la anul, octet următor ar putea referi la luna, și ultimele două octeți ar putea referi la data. Cererea trebuie să găzdui această modificare de tip acoperire de date.

Apoi, traduce o gamă Predicatul la un predicat pe cheia de identitate. De exemplu, "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ă?i

ID articol: 2549443 - Ultima examinare: 22 martie 2013 - Revizie: 2.0
Se aplică la:
  • 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
Cuvinte cheie: 
kbmt KB2549443 KbMtro
Traducere automată
IMPORTANT: Acest articol a fost tradus de software-ul de traducere automată Microsoft, si nu de un traducător. Microsoft vă oferă atât articole traduse de persoane, cât și articole traduse automat, astfel incat aveti access la toate articolele din Baza noastră de informatii în limba dvs. materna. Totuși, un articol tradus automat nu este întotdeauna perfect. Acesta poate conține greșeli de vocabular, sintaxă sau gramatică, la fel cum un vorbitor străin poate face greșeli vorbind limba dvs. materna. Compania Microsoft nu este responsabilă pentru nici o inexactitate, eroare sau daună cauzată de traducerea necorespunzătoare a conținutului sau de utilizarea traducerii necorespunzătoare de către clienții nostri. De asemenea, Microsoft actualizează frecvent software-ul de traducere automată.
Face?i clic aici pentru a vizualiza versiunea în limba engleză a acestui articol: 2549443

Trimite?i feedback

 

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