我們嘗試使用Azure上的數據庫,全文搜索,得到了使用CONTAINS搜索性能問題。有包含完整的文本搜索是很慢的
我們的數據有星型模式,事實表已經啓用聚集列存儲索引和大約40萬行。下面是我們如何使用包含維和活動等不同的查詢事實表的聚合:使用
查詢1 EXISTS:
SELECT f.[FK_DimCompanyCodeId], SUM(f.NetValueInUSD)
FROM [SPENDBY].[FactInvoiceDetail] f
WHERE EXISTS (
SELECT * FROM [SPENDBY].[DimCompanyCode] d
WHERE f.[FK_DimCompanyCodeId] = d.Id
AND CONTAINS(d.*, 'Comcast'))
GROUP BY f.[FK_DimCompanyCodeId]
ORDER BY SUM(f.NetValueInUSD) DESC
該查詢似乎永遠運行下去,永不返回結果。
有外鍵FK_DimCompanyCodeId]
非聚集索引,並且只有一個返回搜索Comcast
當行:
SELECT id FROM [SPENDBY].[DimCompanyCode] d
WHERE CONTAINS(d.*, 'Comcast');
-- will return id = 5
而且還有約27萬行具有FK_DimCompanyCodeId = 5
事實表。
查詢2使用INNER JOIN:
SELECT f.[FK_DimCompanyCodeId], SUM(f.NetValueInUSD)
FROM [SPENDBY].[FactInvoiceDetail] f
INNER JOIN [SPENDBY].[DimCompanyCode] d ON (f.[FK_DimCompanyCodeId] = d.Id)
WHERE CONTAINS(d.*, 'Comcast')
GROUP BY f.[FK_DimCompanyCodeId]
ORDER BY SUM(f.NetValueInUSD) DESC
該查詢似乎永遠再也不返回結果爲好。使用
查詢3 #temp表:
SELECT id INTO #temp FROM [SPENDBY].[DimCompanyCode] d
WHERE CONTAINS(d.*, 'Comcast');
SELECT f.[FK_DimCompanyCodeId], SUM(f.NetValueInUSD)
FROM [SPENDBY].[FactInvoiceDetail] f
WHERE EXISTS (
SELECT * FROM #temp
WHERE f.[FK_DimCompanyCodeId] = #temp.Id)
GROUP BY f.[FK_DimCompanyCodeId]
ORDER BY SUM(f.NetValueInUSD) DESC
非常快,返回5秒後的結果。
爲什麼全文搜索是在例1和例2
中的相關問題:https://stackoverflow.com/questions/2750870/sql-serve-full-text-search-with-containstable-is-very-slow-when-used-in-join –
您是否可以添加實際執行計劃(x毫升)從您的查詢?這將是真正有用的。 – wBob