J'ai deux tables:FreeText COUNT requête sur plusieurs tables est super lent
**Product**
ID
Name
SKU
**Brand**
ID
Name
table produit a environ 120K enregistrements table de marque a 30K records
Je dois trouver le nombre de tous les produits avec nom et marque correspondant à un mot clé spécifique.
J'utilise FreeText 'contient' comme ceci:
SELECT count(*)
FROM Product
inner join Brand
on Product.BrandID = Brand.ID
WHERE (contains(Product.Name, 'pants')
or
contains(Brand.Name, 'pants'))
Cette requête prend environ 17 secondes . J'ai reconstruit l'index FreeText avant d'exécuter cette requête.
Si je vérifie seulement pour Product.Name. Ils demandent moins de 1 seconde. Pareil, si je vérifie seulement le Brand.Name. Le problème se produit si j'utilise la condition OU.
Si je passe requête à utiliser LIKE:
SELECT count(*)
FROM Product
inner join Brand
on Product.BrandID = Brand.ID
WHERE Product.Name LIKE '%pants%'
or
Brand.Name LIKE '%pants%'
Il faut 1 sec.
je lis sur 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.
J'ajouté un INNER REJOINT table DE:
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')
Il en résulte une erreur: Impossible d'utiliser un prédicat CONTAINS ou FREETEXT sur colonne 'ProductName' car elle n'est pas indexée en texte intégral. Donc, la question est - pourquoi la condition OU pourrait causer une requête lente, par exemple?
Avez-vous un index sur Product.BrandID? –
Oui, il existe un index sur Product.BrandID. –