1

Nous essayons d'utiliser la recherche de texte intégral sur la base de données Azure et nous avons eu des problèmes de performances lors de l'utilisation de la recherche CONTAINS.La recherche plein texte avec CONTAINS est très lente

Nos données ont un schéma en étoile, la table de faits a un index de magasin de colonnes en cluster activé et environ 40 millions de lignes. Ci-dessous est la façon dont nous utilisons CONTIENT sur la dimension et une agrégation sur la table d'information sur les différentes requêtes:

Requête 1 avec 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 

Cette requête semble courir pour toujours et ne reviennent jamais le résultat.

Il y a index non-cluster sur la clé étrangère FK_DimCompanyCodeId] et il n'y a qu'une seule ligne de retour lors de la recherche Comcast:

SELECT id FROM [SPENDBY].[DimCompanyCode] d 
WHERE CONTAINS(d.*, 'Comcast'); 
-- will return id = 5 

Et il y a environ 27 millions de lignes de table de faits qui a FK_DimCompanyCodeId = 5.

Requête 2 en utilisant 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 

Cette requête semble courir pour toujours et ne reviennent jamais le résultat aussi bien.

Requête 3 en utilisant le tableau #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 

très rapide, renvoie le résultat au bout de 5 secondes.

Pourquoi la recherche en texte intégral est si lent dans les cas 1 et 2.

+0

Trouvé question connexe: https://stackoverflow.com/questions/2750870/sql-serve-full-text-search-with-containstable-is-very-slow-when-used-in-join –

+0

Êtes-vous en mesure d'ajouter des plans d'exécutions réelles (le x ml) à partir de vos requêtes? Ce serait vraiment utile. – wBob

Répondre

0

Finalement, je me suis dit à CONTAINS fonctionne bien sur une colonne spécifique (Description par exemple):

SELECT f.[FK_DimCompanyCodeId], SUM(f.NetValueInUSD) 
FROM [SPENDBY].[FactInvoiceDetail] f 
WHERE f.[FK_DimCompanyCodeId] IN (
     SELECT d.Id FROM [SPENDBY].[DimCompanyCode] d 
     WHERE CONTAINS(d.[Description], 'Comcast') 
) 
GROUP BY f.[FK_DimCompanyCodeId] 
ORDER BY SUM(f.NetValueInUSD) DESC 

Afin de rechercher toute la table, CONTAINSTABLE aura les meilleures performances et éviter d'utiliser #temp tableau:

SELECT f.[FK_DimCompanyCodeId], SUM(f.NetValueInUSD) 
FROM [SPENDBY].[FactInvoiceDetail] f 
LEFT OUTER JOIN CONTAINSTABLE([SPENDBY].[DimCompanyCode], *, '"Comcast"') ct 
ON f.[FK_DimCompanyCodeId] = ct.[Key] 
WHERE ct.[Key] IS NOT NULL 
GROUP BY f.[FK_DimCompanyCodeId] 
ORDER BY SUM(f.NetValueInUSD) DESC 
1

Le problème est index en compétition - un pour le JOIN et un pour le filtre. Peut-être un sous-requête convaincrait SQL Server pour utiliser l'index de texte premier:

SELECT f.[FK_DimCompanyCodeId], SUM(f.NetValueInUSD) 
FROM [SPENDBY].[FactInvoiceDetail] f JOIN 
    (SELECT id 
     FROM [SPENDBY].[DimCompanyCode] cc 
     WHERE CONTAINS(cc.*, 'Comcast') 
    ) cc 
    ON cc.id = f.FK_DimCompanyCodeId 
GROUP BY f.[FK_DimCompanyCodeId] 
ORDER BY SUM(f.NetValueInUSD) DESC 

Il serait utile probablement si vous avez un index sur FactInvoiceDetail(FK_DimCompanyCodeId).

+0

Merci pour votre réponse, j'ai essayé d'exécuter votre requête et il semble que le résultat ne retourne jamais aussi bien –

+0

Salut Cuong - pouvez-vous partager les plans estimés pour les exemples qui ont duré indéfiniment - et ensuite le plan réel pour l'exécution rapide? –

+0

@JoeSack: S'il vous plaît jeter un oeil ma réponse, j'ai découvert en utilisant «CONTAINSTABLE» obtient la meilleure performance –