我正在使用SQL 2008全文搜索功能,根据我使用Contains或ContainsTable的方式,性能存在严重问题。
这里是一个示例:(表1约有5000条记录,并且在表1上有一个覆盖索引,该索引包含所有出现在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)
结果:秒级(超快)
总之,如果我在任何类型的连接或where子句条件中使用Containstable,并且该select语句还有其他条件,则性能非常差。此外,如果查看分析器,从数据库读取的数量会飙升。但是,如果我先执行全文搜索并将结果放入表变量中,然后使用该变量,一切都会变得非常快。读取的数量也要少得多。在“糟糕”的情况下,它似乎陷入了一个循环中,导致它多次从数据库中读取,但我当然不明白为什么。
现在的问题首先是为什么会发生这种情况?第二个问题是表变量的可扩展性如何?如果结果有成千上万条记录,它还会保持快速吗?
有任何想法吗? 谢谢