改善在 SQL Server 中的全文檢索查詢的效能

文章翻譯 文章翻譯
文章編號: 2549443 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

本文說明的方法,以改善查詢效能的 Microsoft SQL Server 也會使用全文檢索搜尋述詞 (例如包含建議您),而且,也可以篩選資料。比方說,這個方法可以改善下列查詢的效能:
select * from dbo.ftTest where CONTAINS(TextData, '"keyword"') and CDate > @date
這個方法可讓您設計查詢、 資料表結構描述和一種全文檢索搜尋引擎要篩選出的結果會在傳送到關聯式引擎前的全文檢索索引。因此,關聯式引擎沒有篩選大型資料集。

其他相關資訊

當您建立的全文檢索搜尋查詢時,原則的因素會影響查詢的效能是全文檢索搜尋引擎必須處理之前的剩餘的資料量的資料都會傳送到關聯式引擎。在 SQL Server 中您可以篩選掉的資料列提早減少必須稍後處理的資料列數目,以改善查詢的效能。

在 SQL Server 的 SQL Server 2008年之前發行的版本,全文檢索搜尋引擎會傳回符合搜尋項目中,所有資料列,然後關聯式引擎套用任何篩選條件。在 SQL Server 2008年中,SQL Server 2008 R2,以及 SQL Server 2012年做這種行為的改良功能。不過,很難使用這些改進功能,因為全文檢索索引會從資料庫索引組織十分不同。此外,全文檢索搜尋引擎和關聯式引擎會非常不同的方式運作。因此,本文所描述的方法使用屬性函式 (TVF),盡早剔除的資料列,並減少必須稍後處理的資料列數目。

比方說,使用下列的查詢計劃會傳回 131051 符合包含搜尋字串的資料列。此外,計劃中的連接運算子會執行額外的篩選,使用索引搜尋。
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 
不過,如果查詢包含作為述詞的全文檢索唯一索引鍵資料行,全文檢索搜尋引擎可以使用述詞來篩選結果的全文檢索層級。在此情況下,TVF 會傳回較少的資料,必須套用其他篩選之前。例如,下列查詢中指定了五個值必須符合 c2 條件,並會 TVF 傳回只有符合五個值的結果:
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
全文檢索搜尋引擎的能力推入所使用的唯一索引鍵的值會是下列方法的基礎。

如果述詞中包含的日期時間資料型別資料行,您可以將日期資訊的唯一索引鍵資料行,這樣只有符合這個述詞的資料列才會發出。若要這樣做,則必須以邏輯方式加入索引鍵資料行中的日期資訊。不過,您也可能要變更的索引鍵資料行資料型別和應用程式中使用通過查詢。

若要實作的方法,變更 [全文檢索唯一的資料型別金鑰 BIGINT 的識別碼。前 4 個位元組,索引鍵識別碼擷取的年度、 月份和日期值,從 [日期] 欄中,而且最後 4 個位元組保持相同。例如,機碼識別碼就能參照到年的第一個位元組,月份名稱,就能參照下一個位元組,而最後的兩個位元組就能參照到的日期。應用程式必須考慮到這個變更的資料型別。

然後,轉譯為索引鍵述詞的範圍述詞識別碼。例如,"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="">

屬性

文章編號: 2549443 - 上次校閱: 2013年3月22日 - 版次: 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 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:2549443
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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