2010-12-03 21 views
1

Voici ma requête, il faut un certain temps environ 1 minute et quelques fois donne un résultat dans un second, problème est survenu spécialement j'exécute la requête après un certain temps il y a, ou mettre un nouveau mot-clé dans la requête. Cela ressemble à un problème d'index, quand j'ai exécuté le plan d'exécution, RID Look up a coûté 60%. La table source contient environ 2 à 5 données Lacs et chaque jour environ 10 000 à 20 000 lignes seront ajoutées. Conseillez-moi, s'il-vous-plaît. MerciRequête SQL Server Un certain temps prend trop de temps avec freetexttable - Looks Index Problème

SELECT * 
FROM (SELECT Row_number() OVER (ORDER BY rank DESC, jobid DESC) AS rnum, 
       * 
     FROM (SELECT rank, 
         joblistview.* 
       FROM joblistview, 
         FREETEXTTABLE(joblistview, jobtitle, 'seo manager') f 
       WHERE joblistview.jobid = f.[key] 
         AND CONTAINS(joblistview.joblocation, 'mumbai') 
       UNION 
       SELECT rank, 
         joblistview.* 
       FROM joblistview, 
         FREETEXTTABLE(joblistview, jobdescription, 'seo manager') 
         f 
       WHERE joblistview.jobid = f.[key] 
         AND CONTAINS(joblistview.joblocation, 'mumbai') 
       UNION 
       SELECT rank, 
         joblistview.* 
       FROM joblistview, 
         FREETEXTTABLE(joblistview, company_name, 'seo manager') f 
       WHERE joblistview.jobid = f.[key] 
         AND CONTAINS(joblistview.joblocation, 'mumbai')) AS xx)AS 
     tt 
WHERE rnum BETWEEN 11 AND 20 

Plan d'exécution

SQL Execution Plan

+0

Vous avez unifié trois fois la même requête - qu'est-ce qui donne? –

+0

Ce ne sont pas la même requête, chaque requête recherche une colonne différente (jobtitle, description du travail, nom de la société) en utilisant la fonction FREETEXTTABLE. – AUSteve

Répondre

0

Vous pouvez spécifier plusieurs colonnes en une seule FREETEXTTABLE recherche, ce qui devrait éliminer le besoin de plusieurs requêtes avec les partenaires sociaux.

SELECT * 
FROM (SELECT Row_number() OVER (ORDER BY rank DESC, jobid DESC) AS rnum, 
       * 
     FROM (SELECT rank, 
         joblistview.* 
       FROM joblistview, 
         FREETEXTTABLE(joblistview, (jobtitle,jobdescription,company_name), 'seo manager') f 
       WHERE joblistview.jobid = f.[key] 
         AND CONTAINS(joblistview.joblocation, 'mumbai') 
       ) AS xx 
     ) AS tt 
WHERE rnum BETWEEN 11 AND 20 
+0

Salut merci pour la réponse .. Je l'ai déjà fait, mais le résultat allait beaucoup mieux en termes de pertinence avec Union. Bien sûr, avec des résultats de plusieurs colonnes viendra rapidement. Avec Union également résultat la performance est bonne Mais le problème est que je pense qu'il est lié à l'indice .. Chaque fois que de nouveaux termes viennent à la recherche, il prend trop de temps. – Vkalal

0

Avez-vous essayé d'ajouter une colonne calculée qui contient des données de toutes vos colonnes de recherche? Configurez ensuite cette colonne calculée pour qu'elle soit persistante et qu'elle soit indexée en texte intégral. Vous pouvez alors essayer

SELECT * 
FROM (SELECT Row_number() OVER (ORDER BY rank DESC, jobid DESC) AS rnum, 
       * 
     FROM (SELECT rank, 
         joblistview.* 
       FROM joblistview, 
         FREETEXTTABLE(joblistview, (<<<ComputedColumn>>>), 'seo manager') f 
       WHERE joblistview.jobid = f.[key] 
         AND CONTAINS(joblistview.joblocation, 'mumbai') 
       ) AS xx 
     ) AS tt 
WHERE rnum BETWEEN 11 AND 20