我正在使用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