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 :

Select Distinct dans un CONCAT


Sujet :

Développement SQL Server

  1. #21
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    Citation Envoyé par ampex Voir le message
    oui effectivement ça fonctionne.
    mais je n'arrive pas au bout de la requête.. 20 min et elle tourne tjs.
    j'ai tenté de passer par une #temp mais ça reste lourd..
    je suppose que tu as exécuté la requête sur des données réelles avec un plus ou moins gros volume?
    Si oui, Combien de ligne as-tu dans ta table ?
    as tu mis les index qui vont bien ?

    Cordialement,

  2. #22
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Par défaut
    le résultat de la CTE c'est 135 000 lignes, sans filtres, en 15s.
    en mettant un index sur la table temporaire et exécutant les filtres, j'obtiens les mêmes délais (> de 30 min)

  3. #23
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    N'étant pas sur d'avoir compris à 100% le résultat attendu, voici une proposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    WITH data(ID, pred, suiv) AS
    (
    	SELECT 'B' AS id, 'A' as pred, 'C' as suiv
    	UNION 
    	SELECT 'C', 'B', null
    	UNION 
    	SELECT 'A', null, 'B'
    ),
    chaine(ID, suiv, result) AS 
    (
    	SELECT id, suiv, CAST(id AS VARCHAR(MAX)) FROM data WHERE pred IS NULL
    	UNION ALL
    	SELECT D.id, E.suiv, D.result + ', ' + E.id FROM chaine AS D 
    	INNER JOIN data AS E ON D.suiv = E.id
    )
    SELECT * FROM chaine WHERE suiv IS NULL;
    La CTE data est bien entendu a remplacer par la source de données.
    En gros, la requête construit la chaîne de manière récursive (comme le fait la solution de StringBuilder). La différence, c'est qu'elle ne recherche pas les doublons puisqu'elle ne retient que les chaînes complètes, sans prédécesseur, ni successeur.

    Mais sans jeu de données sur lequel confronter les résultats, ce n'est pas évident de bien comprendre le problème et d'y proposer une solution adéquat.

  4. #24
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ampex Voir le message
    le résultat de la CTE c'est 135 000 lignes, sans filtres, en 15s.
    en mettant un index sur la table temporaire et exécutant les filtres, j'obtiens les mêmes délais (> de 30 min)
    Je ne sais pas où tu as mis tes index, mais avec des requêtes avec des LIKE '%xxx' cela m'étonnerait qu'ils soient utilisés...

  5. #25
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 617
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par dorinf Voir le message
    N'étant pas sur d'avoir compris à 100% le résultat attendu, voici une proposition :
    Mais sans jeu de données sur lequel confronter les résultats, ce n'est pas évident de bien comprendre le problème et d'y proposer une solution adéquat.
    Nous sommes d'accord

    Citation Envoyé par dorinf Voir le message
    Je ne sais pas où tu as mis tes index, mais avec des requêtes avec des LIKE '%xxx' cela m'étonnerait qu'ils soient utilisés...
    bis !

  6. #26
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    Pourquoi utiliser une table temporaire ? c'est contre-performant.

    que donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SELECT TOP 25
    dm_mid.database_id AS DatabaseID,
    dm_migs.avg_user_impact*(dm_migs.user_seeks+dm_migs.user_scans) Avg_Estimated_Impact,
    dm_migs.last_user_seek AS Last_User_Seek,
    OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) AS [TableName],
    'CREATE INDEX [IX_' + OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) + '_'
    + REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.equality_columns,''),', ','_'),'[',''),']','') 
    + CASE
    WHEN dm_mid.equality_columns IS NOT NULL
    AND dm_mid.inequality_columns IS NOT NULL THEN '_'
    ELSE ''
    END
    + REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.inequality_columns,''),', ','_'),'[',''),']','')
    + ']'
    + ' ON ' + dm_mid.statement
    + ' (' + ISNULL (dm_mid.equality_columns,'')
    + CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns 
    IS NOT NULL THEN ',' ELSE
    '' END
    + ISNULL (dm_mid.inequality_columns, '')
    + ')'
    + ISNULL (' INCLUDE (' + dm_mid.included_columns + ')', '') AS Create_Statement
    FROM sys.dm_db_missing_index_groups dm_mig
    INNER JOIN sys.dm_db_missing_index_group_stats dm_migs
    ON dm_migs.group_handle = dm_mig.index_group_handle
    INNER JOIN sys.dm_db_missing_index_details dm_mid
    ON dm_mig.index_handle = dm_mid.index_handle
    WHERE dm_mid.database_ID = DB_ID()
    and OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) = 'noeud'
    ORDER BY Avg_Estimated_Impact DESC
    GO
    au besoin modifie le nom de ta table 'noeud' dans le script dans la clause where

    Cordialement,

Discussions similaires

  1. [AC-2002] Select distinct dans Requete analyse croisées
    Par Lidouminou dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 30/05/2012, 14h34
  2. SELECT DISTINCT dans une dataTable
    Par GreatDeveloperOnizuka dans le forum C#
    Réponses: 2
    Dernier message: 05/02/2010, 16h21
  3. Select Distinct dans clientDataset
    Par QAYS dans le forum Langage
    Réponses: 6
    Dernier message: 30/10/2008, 14h08
  4. Garder l'ordre des Records dans une requete select distinct
    Par pobrouwers dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 21/02/2007, 22h06
  5. Selection distincte dans un dlookupcombobox
    Par Tyler Durden dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/10/2005, 08h19

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