我有两张桌子:
**Product**
ID
Name
SKU
**Brand**
ID
Name
产品表有大约 120K 条记录 Brand 表有 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 条件会导致查询缓慢?