Zlepšenie výkonnosti v SQL Server celotextového dotazoch

DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.

Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem: 2549443
Súhrn
Tento článok popisuje metódu zlepšiť výkonnosť dotazov Microsoft SQL Server, ktorý použiť celotextové vyhľadávanie predikáty (napríklad obsahuje a CONTAINSTABLE) a ktoré tiež filtrovať údaje. Napríklad, táto metóda zlepšuje výkon nasledovný dotaz:
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
Táto metóda umožňuje návrh dotazu a schémou tabuľky celotextového indexu tak, že full-textové vyhľadávací nástroj, ktorý filtruje výsledky pred ich odoslaním do relačných motora. Preto relačné motor nemusí filtrovať veľké dataset.
Ďalšie informácie
Pri vytváraní full-textové vyhľadávací dotaz, faktor ovplyvňuje výkon dotazu je množstvo údajov, ktoré full-textové vyhľadávací nástroj, ktorý musí spracovať pred zostávajúce údaje sa odošlú do relačných motora. V SQL Server, môžete zlepšiť výkon dotazu filtrovaním riadkov skoro znížiť počet riadkov, ktoré musia byť spracované neskôr.

Vo verziách servera SQL Server, ktoré boli vydané pred SQL Server 2008, full-textové vyhľadávací nástroj vráti všetky riadky, ktoré zodpovedajú hľadaného výrazu, a potom relačné motor platí žiadne filtre. Zlepšenie tohto správania boli vykonané v SQL Server 2008, SQL Server 2008 R2 a SQL Server 2012. Avšak, je ťažké používať tieto zlepšenia, pretože full-textové vyhľadávanie indexy sú organizované veľmi odlišne od databázy indexov. Navyše, full-textové vyhľadávací nástroj a relačných motor pracovať veľmi odlišne. Preto metódy, ktoré popisuje tento článok používa Table-Valued funkcia (TVF) na filtrovanie riadkov skoro a znížiť počet riadkov, ktoré musia byť spracované neskôr.

Napríklad nasledovný dotaz plán vráti 131051 riadky, ktoré spĺňajú obsahuje hľadaný reťazec. Navyše operátora spojenia v pláne vykoná dodatočné filtrovanie pomocou indexu vyhľadávania.
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]), RESIDUA5858 |--Sort(ORDER BY:([FTSdb].[dbo].[fttest].[ID] ASC)) 5858 | |--Clustered Index Seek(OBJECT:([FTSdb].[dbo].[fttest].[clidx1]), SEEK:([FTSdb].[131051 |--Table-valued function 
Však, ak dotaz zahŕňa full-textové jedinečný index kľúčový stĺpec ako predikát, full-textové vyhľadávací nástroj slúži predikát filtrovanie výsledkov na úrovni full-textové. V tejto situácii, TVF vráti oveľa menšie množstvo údajov pred ďalšími filtrovanie musí uplatniť. Napríklad nasledovný dotaz určuje päť hodnôt musí zodpovedať stavu c2 a TVF vráti iba výsledky, ktoré zodpovedajú piatich hodnôt:
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
Fulltextové vyhľadávače schopnosť tlačiť nadol hodnôt, ktoré používa jedinečný index kľúča je základom pre túto metódu.

Ak predikátu obsahuje stĺpec typu údajov DateTime, môžete zahrnúť informácie o dátume v stĺpci jedinečný index kľúča tak, že sú emitované iba riadky, ktoré spĺňajú tento predikát. Na tento účel musí logicky začleniť dátum informácie stĺpca kľúča. Avšak, môže tiež musíte zmeniť kľúčový stĺpec Typ údajov a aplikácie, ktoré používajú dotaz.

Implementovať metódu, zmeniť typ údajov celotextové unikátny kľúč ID BIGINT. Prvé 4 bajty kľúča ID zachytenie rok, mesiac a dátumových hodnôt zo stĺpca dátum a posledné 4 bajty zostávajú rovnaké. Napríklad prvý bajt kľúča ID môže byť rok, ďalšie byte môže byť na mesiaci a posledné dva bajty môže označovať dátum. Žiadosť musí prispôsobiť túto zmenu typu údajov.

Potom preložiť rozsah predikátu predikát na kľúč ID. Napríklad, "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="">

Upozornenie: Tento článok bol preložený automaticky.

Vlastnosti

ID článku: 2549443 – Posledná kontrola: 03/22/2013 08:08:00 – Revízia: 2.0

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

  • kbmt KB2549443 KbMtsk
Pripomienky