[英]Optimize Full-Text Search Across Multiple Tables
我需要在SQL Server數據庫中搜索幾個不同的表。 我需要根據匹配發生在哪個表中對結果進行排序。
我采取的方法如下所示。 但是,隨着數據量的增長,這似乎並不高效。
任何人都可以建議任何技巧來優化這個嗎?
-- Full-text query
DECLARE @FtsQuery nvarchar(100)
SET @FtsQuery = 'FORMSOF(INFLECTIONAL, detail)'
-- Maximum characters in description column
DECLARE @MaxDescription int
SET @MaxDescription = 250
SELECT 1 AS RankGroup, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) AS Description FROM Table1
INNER JOIN CONTAINSTABLE(Table1, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table1.Id
UNION SELECT 2, FTS.Rank, Id, Title, NULL FROM Table2
INNER JOIN CONTAINSTABLE(Table2, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table2.Id
UNION SELECT 3, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table3
INNER JOIN CONTAINSTABLE(Table3, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table3.Id
UNION SELECT 4, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table4
INNER JOIN CONTAINSTABLE(Table4, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table4.Id
UNION SELECT 5, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table5
INNER JOIN CONTAINSTABLE(Table5, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table5.Id
ORDER BY RankGroup, Rank DESC
我考慮過的一個想法是創建一個索引視圖,然后在視圖上執行搜索。 但由於視圖需要這些UNION
,因此很難看出它會如何更有效率。
這是一個難題,因為CONTAINSTABLE一次只能搜索單個表的FTS索引。 只要您的性能可以接受,您的UNION解決方案就可以了。
我們遇到了需要在單個查詢中有效搜索多個表中的多個列的相同問題。 我們所做的是將這些列和表中的所有數據聚合到一個只讀表中。 然后我們的查詢只需要一個CONTAINSTABLE調用
CONTAINSTABLE(AggregatedTable, AggregatedColumn, @FtsQuery)
我們有一個每5-10分鍾運行一次的計划作業,並將源表中的任何修改內容逐步聚合到我們的單個只讀聚合內容表中。
通常,似乎在任何合理大小的數據庫和用戶負載中使用FTS意味着您總是在與性能作斗爭。 如果您發現無論您做什么都無法使性能得到接受,您可能需要調查其他技術,例如Lucene 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.