2016-09-23 18 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中。这是相当有效的现有关系机制的某种重用。 –

相关问题