我有兩個表:FreeText的統計查詢是超級慢
**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秒。同樣,如果我只檢查品牌名稱。如果我使用OR條件,則會發生該問題。
如果我切換查詢中使用,如:
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
To search on multiple tables, use a joined table in your FROM clause to search on a result set that is the product of two or more tables.
所以我增加了一個INNER連接表來自:
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')
這將導致錯誤: 不能使用CONTAINS或FREETEXT謂詞列'ProductName',因爲它沒有全文索引。
所以問題是 - 爲什麼OR條件可能導致諸如查詢緩慢?
你對Product.BrandID的指數? – 2009-11-30 15:28:11
是的,在Product.BrandID上有一個索引。 – 2009-12-02 09:05:57