我正在使用sql 2008全文搜索,而且我的性能有严重问题,这取决于我如何使用Contains或ContainsTable。用于JOIN的Sql serve全文搜索与Containstable非常缓慢!
下面是示例:(表1有大约5000条记录,并且table1上有一个覆盖索引,它包含where子句中的所有字段。我尝试简化语句,所以如果有语法问题,请原谅我。)
方案1:
select * from table1 as t1
where t1.field1=90
and t1.field2='something'
and Exists(select top 1 * from containstable(table1,*, 'something') as t2
where t2.[key]=t1.id)
的结果:10秒(非常慢的)
方案2:
个select * from table1 as t1
join containstable(table1,*, 'something') as t2 on t2.[key] = t1.id
where t1.field1=90
and t1.field2='something'
结果:10秒(非常慢)
方案3:
Declare @tbl Table(id uniqueidentifier primary key)
insert into @tbl select {key] from containstable(table1,*, 'something')
select * from table1 as t1
where t1.field1=90
and t1.field2='something'
and Exists(select id from @tbl as tbl where id=req1.id)
结果:第二(超快速)
底线的分数,这似乎如果我在任何类型的连接中使用Containstable或者在其他条件的select语句的where子句条件下,则性能非常糟糕。另外,如果您查看剖析器,则从数据库读取的数量将进入屋顶。但是,如果我首先进行全文搜索并将结果放入一个表格变量中并使用该变量,则所有内容都变得非常快。读取次数也低得多。看起来在“糟糕”的情况下,它以某种方式卡在循环中,导致它从数据库中读取很多次,但当然我不明白为什么。
现在的问题首先是为什么发生这种情况?问题二是如何扩展表变量?如果结果是成千上万的记录呢?它仍然会很快。
任何想法? 谢谢
似乎与这张海报有关的问题http://stackoverflow.com/questions/2746303/freetext-query-is-slow-includes-top-and-order-by/2749322#2749322。查看执行计划时,自由文本查询中的估计行数和实际行数是多少? – 2010-05-01 17:37:25
哦,并且在回答关于表变量的查询时,如果你打算将它们加入到其他表中,它们肯定是不可缩放的。查询优化器总是假设它们只返回1行,如果它们有数万条记录,则可能导致一些非常优化的计划。临时表确实为他们创建了统计数据。 – 2010-05-01 18:03:10