我们尝试使用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