IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Distinct et table spool


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Distinct et table spool
    Bonjour à tous,

    J'ai une requête qui met beaucoup trop de temps à s'exécuter. En regardant le plan d'exécution je vois qu'il y a des "table spool" qui mettent beaucoup de temps à s'exécuter. Voici donc la reqûete en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT COUNT(distinct categories_guid)
           as 'c' FROM searchproducts
          WHERE ((CONTAINS((products_name,categories_name), '"Auto*"') 
    AND CONTAINS(categories_name, '"Jeu*"')) 
    AND CONTAINS(categories_name, '"PS2*"'))
    Cette requête met quasiment 1 minute à s'executer .
    Le problème vient apparemment du distinct car sans celui-ci la requête retourne le resultat en moins d'une seconde (et aucun table spool n'est utilisé du coup).

    J'ai essayé de passer par des requêtes imbriquées à la place d'utiliser le distinct mais ca ne change rien.

    Pour info dans le plan d'execution avec le distinct les tables spools ont en entrée environ 600 lignes mais en ressortent 70 000 000 .

    Enfin autre précision importante, si je fais des CONTAINS(categories_name, '"Jeu"') à la place des CONTAINS(categories_name, '"Jeu*"'), alors la requete est instantanée.

    Quelqu'un pourrait-il m'orienter sur une piste pour resoudre ce problème?

    Merci d'avance

    Paske

  2. #2
    Invité
    Invité(e)
    Par défaut
    bien évidemment, pour les informations utiles, on va utilisé la boule de cristal...
    Script de ta table, taille, indexes...
    Pareil, le plan exécution, on le devine...
    Pourquoi tu utilises contains et pas like...

    Attends-moi, je vais consulter l'horoscope et je te ramène la réponse.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Quelle version de SQL Server ????

    Repondez à nos questions SVP !!!!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Désolé j'avais une vie sociale à gérer après le boulot hier, je n'ai pas pu répondre dans les heures qui ont suivi. Quant à ta boule de cristal j'espère qu'elle a pu t'aider un minimum...

    Pour le reste il s'agit de Sql Server 2008 RTM. Et voici la définition de la vue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE VIEW [dbo].[SearchProducts]
    WITH SCHEMABINDING 
    AS
    SELECT     dbo.Categories.Categories_Name, dbo.Products.Products_GUID, dbo.Products.Products_Name, dbo.Products.MainProperties, dbo.Categories.Categories_Guid, 
                          dbo.Categories.Categories_KeyWords, dbo.Products.Products_Online
    FROM         dbo.Categories INNER JOIN
                          dbo.Products ON dbo.Categories.Categories_Guid = dbo.Products.Categories_GUID
    WHERE     (dbo.Products.Products_Online = 'true') AND (dbo.Categories.Categories_Online = 'true') AND (dbo.Categories.preRelease = 'false')
     
    GO
    Avec:
    Categories_name: varchar(100) NON NULL
    Products_guid: uniqueidentifier NON NULL
    Products_Name: varchar(400) NON NULL
    Products.MainProperties: varchar(500) NON NULL
    Categories.Categories_Guid: uniqueidentifier NON NULL
    Categories.Categories_KeyWords: varchar(2000) NON NULL
    Products.Products_Online: bit NON NULL

    index de la vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE UNIQUE CLUSTERED INDEX [IX_SearchProducts] ON [dbo].[SearchProducts] 
    (
    	[Products_GUID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    GO
    la vue retourne un total de 112000 lignes. Quant à l'utilisation de contains plutot que du like c'est justement pour tous les avantages qu'apporte l'utilisation du fulltext.

    Et si vous voulez les plans d'executions les voici, mm si vous n'avez pas le détails (distinct puis non distinct). Je re-précise qu'en moyenne en entrée de la table spool on a 600 lignes et 70 000 000 en sortie.

    http://img521.imageshack.us/f/planlent.jpg/
    http://img163.imageshack.us/f/planrapide.jpg/

    Merci pour votre aide malgré une pointe de sarcasme de jerome_mtl dont je me serai bien passé.

Discussions similaires

  1. [2008R2] DISTINCT 2 tables sans UNION
    Par sdisp+ dans le forum Développement
    Réponses: 7
    Dernier message: 07/04/2014, 17h19
  2. Sélection distincte multi-tables
    Par kidpaddle2 dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/09/2010, 07h53
  3. Distinct sur Tables ou listes
    Par olibara dans le forum C#
    Réponses: 4
    Dernier message: 21/08/2009, 07h29
  4. Compte Distinct dans Table croisée
    Par JLV1975 dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 17/10/2008, 17h41
  5. DateDiff avec 2 dates dans 2 tables distinctes
    Par delff dans le forum Access
    Réponses: 2
    Dernier message: 24/07/2006, 09h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo