多个表上的 FreeText COUNT 查询超级慢
我有两个表:
**Product**
ID
Name
SKU
**Brand**
ID
Name
产品表有大约 120K 条记录 品牌表有 30K 条记录,
我需要查找名称和品牌与特定关键字匹配的所有产品的数量。
我使用自由文本“包含”,如下所示:
SELECT count(*)
FROM Product
inner join Brand
on Product.BrandID = Brand.ID
WHERE (contains(Product.Name, 'pants')
or
contains(Brand.Name, 'pants'))
此查询大约需要17秒。 我在运行此查询之前重建了 FreeText 索引。
如果我只检查 Product.Name。他们的查询时间不到 1 秒。同样,如果我只检查 Brand.Name。如果我使用 OR 条件,就会出现此问题。
如果我将查询切换为使用 LIKE:
SELECT count(*)
FROM Product
inner join Brand
on Product.BrandID = Brand.ID
WHERE Product.Name LIKE '%pants%'
or
Brand.Name LIKE '%pants%'
需要1 秒。
我在 MSDN 上读到:http://msdn.microsoft.com/en-us/library/ms187787.aspx
要搜索多个表,请使用 将 FROM 子句中的表连接到 在结果集上搜索 两个或多个表的乘积。
所以我向 FROM 添加了一个 INNER JOINED 表:
SELECT count(*)
FROM (select Product.Name ProductName, Product.SKU ProductSKU, Brand.Name as BrandName FROM Product
inner join Brand
on product.BrandID = Brand.ID) as TempTable
WHERE
contains(TempTable.ProductName, 'pants')
or
contains(TempTable.BrandName, 'pants')
这会导致错误: 无法对列“ProductName”使用 CONTAINS 或 FREETEXT 谓词,因为该列未建立全文索引。
所以问题是 - 为什么 OR 条件可能会导致查询速度慢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
经过一番尝试后,我发现了一个似乎有效的解决方案。它涉及创建索引视图:
如果我运行以下查询:
现在再次需要1秒。
After a bit of trial an error I found a solution that seems to work. It involves creating an indexed view:
If I run the following query:
It now takes 1 sec again.
我遇到了类似的问题,但我用 union 修复了它,例如:
I ran into a similar problem but i fixed it with union, something like:
你有没有尝试过类似的事情:
Have you tried something like: