我們有一個ASP MVC網站部署到生產這是一個非常大/流行的網站,它會得到相當多的流量。SQL Server R2 2008全文搜索導致'等待超時'隨機
我們使用全文搜索來驅除搜索設施。
非常隨機地,我在我們的ELMAH日誌中看到一堆錯誤,「等待操作超時」。發生這種錯誤時,似乎很多顧客都是同一時間 - 例如我們會在相同的時間戳內記錄4或5個此錯誤的實例。它似乎從未孤立地發生過。
基本上,在我們的目錄頁面上,我們執行了5到6個查詢(例如'獲取所有子類別','獲取所有制造商','獲取最小/最大價格範圍','獲取實際產品')和從查看堆棧跟蹤中可以看出,它將是導致異常的其中一種方法。
但是,通常情況下,他們會將用戶的篩選選項應用到每個查詢以顯示相關信息。
所以它似乎只有失敗(很少),當一個搜索詞存在。例如,當客戶查看沒有搜索字詞的目錄頁面時,我還沒有看到任何其他超時問題。
任何人都可以指出我可能發生潛在死鎖的方向嗎?我們的全文索引位於View,它從我們的產品表中提取數據。這種情況每天都會通過股票信息等進行多次更新,但視圖引入的列並不會經常更改其數據。 因爲它太隨意了,所以很難真正查明它發生的位置 - 當我導航到一個我可以看到之前導致異常的URL時,頁面加載非常快(就像搜索結果已經緩存到一定程度)。
位的詳細信息: 54612排在視圖中(2列 - 產品ID /搜索文本) SEARCHTEXT列是索引全文有95個字符最大行,所以它不是數據的巨量。大部分目錄頁面大約需要600ms才能渲染,通常這些查詢大約需要20-30ms。但是,有時候這會大大增加 - 我已經看到了執行每個查詢需要大約6秒的跟蹤,其他時間其中6個會超時並且只是非常隨機的尖峯。我從來沒有真正經歷過這種放緩,但我不經常瀏覽網站,但我們有新的遺蹟交易(和錯誤日誌),顯示頻繁減速&超時。
我們使用
@Search = '("some*" AND "search*" AND "terms*")'
SELECT TOP ? * FROM (SELECT p.Score, [columns], [Rank] as SearchRank, ROW_NUMBER() OVER
(ORDER BY p.Score * [Rank] DESC, p.Id DESC) AS row_number
FROM Product p
INNER JOIN Manufacturer AS m ON p.ManufacturerId = m.Id
INNER JOIN ProductCategory pcm ON p.Id = pcm.ProductId
INNER JOIN CONTAINSTABLE(vw_SearchProducts, FullSearch, @Search) AS FTS ON p.Id = FTS.[KEY]
WHERE p.Deleted = ? AND pcm.CategoryId = @CategoryId) p WHERE p.row_number > ? ORDER BY p.Score * SearchRank DESC, p.Id DESC
查詢和我們的觀點看起來像這樣,通過產品ID爲FTS鍵:
SELECT p.Id AS ProductId, Colour + ' ' + Size ' ' + m.Name + ' ' + Categories AS FullSearch
FROM Product
INNER JOIN Manufacturer m ON m.Id = p.ManufacturerId
WHERE Deleted = 0
我們的產品表中包含服務表現目的,一些反規範化的數據。 我們對目錄頁面的6個主要查詢都與上述類似,只是針對與過濾/搜索條件匹配的產品提取不同的數據位。
我們實際上很快升級到SQL Server 2016 - 不確定這是否會讓事情變得更好。
乾杯
嗨,我已經添加了一個示例查詢和我們的視圖。對探查器好評。我一直在仔細研究FTS人羣報告的時間安排,我已經看到時間從幾個毫秒到幾秒鐘,似乎還算可以。我認爲'16升級即將到來 - 希望這應該有所幫助,我注意到最近這些頻率有了大幅度的提高。 –
@StevenSproat感謝您的投票。請注意,如果您在SQL Profiler中監視INSERT調用,那麼這些不是FTS索引插入,而是底層表INSERTS。 FTS監視基表,當FTS索引的數據改變時,它開始重建實際的FTS索引,並且你在profiler中看不到。相反,當通過SSMS選擇FTS索引屬性或運行如下答案中的查詢時,您會看到它:http://stackoverflow.com/a/2727952/5857386。 – andrews
未觸及時,FTS指數人口狀態爲「空閒」,但在重建時,SSMS將其狀態報告爲「填充」。因此,請嘗試監控您的FTS指數狀態,看看它是否經常重建。 – andrews