2016-09-23 36 views
5

我們使用SQL Server 2008 R2全文搜索來搜索260萬條記錄。搜索性能通常很差,它遵循通常報道的模式:冷系統/首次運行〜10 +秒,隨後運行〜1-2秒。這是內嵌於2月,2013年的文章中報道的結果:自2008 R2版本以來是否有任何Sql Server全文搜索(FTS)性能改進?

So You Think You Can Search – Comparing Microsoft SQL Server FTS and Apache Lucene

文章給出了以下速度比較結果使用維基百科轉儲數據:

 
Indexing speed, size and single query execution time using: 

         Lucene  MS SQL FTS 
Indexing Speed   3 MB/sec 1 MB/sec 
Index Size    10-25%  25-30% 
Simple query   < 20 ms  < 20 ms 
Query With Custom Score < 4 sec  > 20 sec 
 
Parallel Query Executions (10 threads, average execution time per query in ms): 

            MS SQL FTS Lucene (File System) Lucene (RAM) 
Cold System:   Simple Query 56   643     21 
        Boost Query  19669*  859     27 
Second executions: Simple Query 14   8      < 5 
        Boost Query  465   17      9 

*average time, the very first query could be executed up to 2 min(!) 

我的問題是:

  1. 由於有幾個主要的SQL Server版本自2013年2月8日發佈文章以來,有人可以在遷移到更新的SQL Server版本(2012,2014和2016)時報告相同數據(最好是超過1百萬條記錄)的任何FTS性能改進?

  2. 更新的SQL Server版本是否支持像solr/lucene一樣支持放在RAM中的FTS目錄/索引?

UPDATE:在我們的場景中,我們很少將新數據插入FT目錄鏈接表,但運行只讀搜索非常頻繁。所以,我不認爲SQL不斷重建FTS索引是個問題。

回答

1

Fulltext Search Improvements in SQL Server 2012

我們着眼於從在等待正在進行的索引更新釋放共享模式鎖,從指數片段人口中有多少內存分配查詢如何阻止整個代碼庫,對我們如何可以將查詢代碼庫重新組織爲流式表值函數,以優化TOP N搜索查詢,我們如何維護密鑰分佈直方圖以在並行線程上執行搜索,以及如何更好地利用處理器計算指令(評分等級)...最終的結果是,我們能夠顯着提高性能(在大型查詢工作中併發索引更新的情況下,在許多情況下都可以提高10倍) oads)和規模,而無需更改任何存儲結構或現有的API表面。我們所有從SQL 2008/R2到Denali的客戶都將受益於這一改進。

+0

感謝您的評論,非常有價值的信息。但是,我正在尋找真實世界的經驗。除了MSFT聲明之外,當有人從SQL Server 2008 R2遷移到更新的版本時,是否可以報告真實的FTS性能增長?到目前爲止,我發現許多人抱怨FTS緩慢,即使在最近的SQL服務器版本中(例如2014)。就FTS而言,SQL Server 2005似乎是最快的版本。 – andrews

+0

開發者版本是免費的並且與企業具有相同的功能。您可以使用它們作爲測試場地 – TheGameiswar

+0

我們有ms訂閱。獲取新的sql實例不是問題。只收集有關要升級到哪個版本的數據。如果搜索時間保持現在的狀態,我們將從FTS轉移到solr。 – andrews

0

我建議你挖掘一下SQL Server FTS內部。這會讓你知道你的查詢是如何執行的,以及這是否適用於你。我建議從這裏開始:https://technet.microsoft.com/en-us/library/ms142505(v=sql.105).aspx和這裏:https://msdn.microsoft.com/ru-ru/library/cc721269.aspx。內部FTS使用表和索引。具有所有的優點和缺點。因此,如同任何其他表一樣,如果該內部表的數據不在緩衝池中,SQL Server將從磁盤讀取到RAM。一旦數據存入RAM中,它將從RAM中讀取。

+0

丹尼斯,感謝您的鏈接。但請參閱我在我的問題中鏈接的文章。這篇文章指出,Solr/Lucene特別支持RAM中的索引位置,並且當Solr索引位於RAM中時,即使對於冷查詢,也會注意到性能會提高,而SQL Server據說不支持這種情況。我想知道SQL Server FTS在最近的版本中是否具有這個特定功能,而不包括默認情況下正常使用的索引緩存。 – andrews

+0

@andrews,是的,這就是我想強調的,這個聲明:「SQL Server使用磁盤,Lucene使用RAM」,是不正確的。如果你有32 GB的內存,但你的索引是64 GB,無論如何,你不能完全保留它在RAM中,既不使用SQL Server,也不使用Lucene。 –

+0

@andrews SQL Server FTS只是一組在FTS查詢中與用戶表連接的表。像任何其他表一樣,FTS數據只能從RAM中讀取,所以SQL Server應該將需要的數據送到RAM併發送給客戶端。如果RAM足夠,所有的數據將保留在RAM中。這是相當有效的現有關係機制的某種重用。 –

相關問題