我們有一個有趣的問題,我希望有人能夠幫助解決一些問題。在高層次上的問題如下:在查詢中使用過濾器和CONTAINSTABLE時的執行計劃不佳
下面的查詢快速執行(1秒):
SELECT SA.*
FROM cg.SEARCHSERVER_ACTYS AS SA
JOIN CONTAINSTABLE(CG.SEARCHSERVER_ACTYS, NOTE, 'reports') AS T1 ON T1.[Key]=SA.UNIQUE_ID
,但如果我們添加了一個篩選的查詢,則需要大約2分鐘返回:
SELECT SA.*
FROM cg.SEARCHSERVER_ACTYS AS SA
JOIN CONTAINSTABLE(CG.SEARCHSERVER_ACTYS, NOTE, 'reports') AS T1 ON T1.[Key]=SA.UNIQUE_ID
WHERE SA.CHG_DATE>'19 Feb 2010'
看着兩個查詢執行計劃,我可以看到,在第二種情況下有兩個地方有,它們是行的實際和估計數之間的巨大差異:
1)對於FulltextMatch表值函數,估計值約爲22,000行,實際值爲2900萬行(然後在連接前將其過濾爲1670行)和 2)對於索引查找全文索引,其中估計值爲1行,實際值爲13,000行
由於估計結果,優化器選擇使用嵌套循環連接(因爲它假定行數很少),因此計劃效率低下。
我們可以通過(a)參數化查詢並向查詢添加OPTION(OPTIMIZE FOR UNKNOWN)或(b)通過強制使用HASH JOIN來解決問題。在這兩種情況下,查詢都會在1秒內返回,估計似乎是合理的。
我的問題確實是'爲什麼這些估計值被用在表現不佳的案例中,因此非常不準確,可以採取哪些措施來改善它們'?
統計信息在此處使用的索引視圖上的索引是最新的。
任何幫助非常感謝。
據我所知,這是SQL Server版本的一個問題。該問題表現在SQL Server 2008中,沒有Service Pack。將數據庫恢復到具有SP1的計算機上,CU5給出了一個不同的(並且更加高效)的執行計劃。 – 2010-04-16 22:00:24