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 :

Résultat de requête au fil de l'eau [2008R2]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut Résultat de requête au fil de l'eau
    Bonjour bonjour,

    Je vous écrit pour une petite interrogation que j'ai. En effet, j'ai une requête moyennement longue à exécuter (15 minutes). De base, j'ai les résultat s'affichant (ou s'écrivant dans un fichier quand je passe pas powershell) au fil de l'eau.

    Sauf que là, j'ai rajouté deux filtres dans mon where (isnumeric) et (len) et depuis cela, je n'ai plus les résultats au fil de l'eau mais qu'à la fin d'exécution de la requête.

    Hors, pour des scripts qui dépendent de cette requête, cela est assez gênant. Sans la requête, avez-vous moyen de me donner des pistes ? (J'en ai certaines mais bon...)

    Sinon, j'anonymiserais la requête et vous la posterais

    Joyeuse fêtes pour ceux qui font la fête

    ps : Ouais, je suis sur une veiiiiiiiiiiiiiiiiiiiille version

    Bisous bisous

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    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 633
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Il faut poster la requête, indiquer le volume approximatif des tables et leur description (le DDL index inclus)

  3. #3
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Bonjour,

    Voici la petite requête :
    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
    with der_trans as (
        	select cc.cardnumber, MAX(t.dateref) as date_der_transaction
        	FROM table1 cc with (nolock)
        	join table2 t with (nolock) on t.IdCli=cc.cardnumber
        	group by cc.cardnumber
            )
            select macolonne1,
    		{...}
            FROM table1 cc with (nolock)
            join table3 cu with (nolock) on cc.idcust=cu.idcust
            join table4 co with (nolock) on cc.IdContact=co.idcontact
            join table5 ci with (nolock) on co.title=ci.idcvl
            join table6 dt with (nolock) on cc.CardNumber=dt.cardnumber
            join table7 py with (nolock) on py.IdPays=cu.idcountry
            join table8 cdr with (nolock) on cu.IdDynInfo_RFM=cdr.IdDynInfo_RFM
            WHERE blocked = 0 AND ISNUMERIC(cc.CardNumber) = 1 AND len(cc.CardNumber) BETWEEN 10 AND 15
            ORDER BY 1 desc
    Elle n'est pas de moi (je précise avant de me faire lapider pour les with(nolock), j'ai moi aussi envie de me crever les yeux)

    Pour les tables, y'en a tellement que les DDL c'est un peu contraignant mais on est sur du 40-50 colonnes pour la majorité et du 800K+ pour ces tables.

    Du coup le changement a eu lieu en rajoutant cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND ISNUMERIC(cc.CardNumber) = 1 AND len(cc.CardNumber) BETWEEN 10 AND 15
    J'aurais tendance à dire que j'ai fait péter le parcours d'un index mais je ne dirais pas non à un avis externe

    Edit : Index sur la colonne concernée par mon ajout.. : dbo.matable Table 2 Unique CardNumber CardNumber Nonclustered unique index

    ps : Je vais refaire la requête, elle sera donc optimiser (y'a des trucs qui vont pas du tout là dedans...) dont pas mal de substring et de case non nécessaire. Le but est vraiment ici de voir si ma piste est bonne ou non

    Bisous bisous

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    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 633
    Billets dans le blog
    10
    Par défaut
    len(cc.cardnumber) est un prédicat non sargable, il est donc normal que cet ajout pénalise les perfs.

    Ce que vous pouvez tenter c'est de créer une colonne calculée qui contient cette longueur, sous réserve qu'il y ait un grand nombre de longueurs différentes, ça peut sensiblement améliorer les perfs

  5. #5
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Le problème est que je n'ai absolument pas le droit de toucher au DDL...

    Donc c'est bien ce problème de la clause LEN qui ferait que je n'ai plus mes résultats qui s'affichent/s'écrivent au fil de l'eau mais seulement une fois que la requête est finie ?

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    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 633
    Billets dans le blog
    10
    Par défaut
    Pas directement : les prédicats non sargables expliquent, quand les tables en jeu sont volumineuses, que la durée d'exécution est importante. Le délai d'affichage dépend aussi de l'outil utilisé en interface

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par JeanYvette Voir le message
    Bonjour,

    Voici la petite requête :
    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
    with der_trans as (
        	select cc.cardnumber, MAX(t.dateref) as date_der_transaction
        	FROM table1 cc with (nolock)
        	join table2 t with (nolock) on t.IdCli=cc.cardnumber
        	group by cc.cardnumber
            )
            select macolonne1,
    		{...}
            FROM table1 cc with (nolock)
            join table3 cu with (nolock) on cc.idcust=cu.idcust
            join table4 co with (nolock) on cc.IdContact=co.idcontact
            join table5 ci with (nolock) on co.title=ci.idcvl
            join table6 dt with (nolock) on cc.CardNumber=dt.cardnumber
            join table7 py with (nolock) on py.IdPays=cu.idcountry
            join table8 cdr with (nolock) on cu.IdDynInfo_RFM=cdr.IdDynInfo_RFM
            WHERE blocked = 0 AND ISNUMERIC(cc.CardNumber) = 1 AND len(cc.CardNumber) BETWEEN 10 AND 15
            ORDER BY 1 desc
    Oh l'horrible merde des NOLOCK.... Vez vous lu l'article que je viens d'écrire sur le sujet ?
    http://mssqlserver.fr/les-dangers-du-nolock/

    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/ * * * * *

  8. #8
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Oui, comme j'ai écrit après, faut pas me lapider, c'est pas moi qui ai fait la requête et j'ai justement un point ce matin pour tenter de convaincre mes collègues de la merde que c'est... Le pire c'est qu'il y a moyen que jamais ça ne change...

    Mais il est en effet toujours bien de rappeler qu'utiliser ça, c'est mal

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 963
    Par défaut
    Bonjour,

    et pourquoi ne pas changer la clause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND ISNUMERIC(cc.CardNumber) = 1 AND len(cc.CardNumber) BETWEEN 10 AND 15
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND cc.CardNumber > '999999999' AND cc.CardNumber < '1000000000000000'
    voire par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND TRY_CONVERT(bigint,cc.CardNumber) > 999999999 AND TRY_CONVERT(bigint,cc.CardNumber) < 1000000000000000

  10. #10
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Bonjour,

    Tout simplement parce que je n'y ai pas pensé. Il y a aussi le fait que ces clauses ont étés rajoutées un peu à l'arrache lors d'une réunion...

    Finalement, le fonctionnement a changé un peu et une des clauses a été annulée donc le problème ne se pose même plus...

    Bisous bisous

  11. #11
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour,

    Citation Envoyé par Michel.Priori Voir le message
    et pourquoi ne pas changer la clause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND ISNUMERIC(cc.CardNumber) = 1 AND len(cc.CardNumber) BETWEEN 10 AND 15
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND cc.CardNumber > '999999999' AND cc.CardNumber < '1000000000000000'

    Attention, ça ça ne fonctionnera pas, car la comparaison se fera sur des chaines, et donc par exemple '888888888888' ne sera pas validé. En fait, rien ne sera validée, car aucune chaine ne commence par un caractère se trouvant entre le 9 et le 1 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier les requètes DNS au fil de l'eau ? Comment faire.
    Par Devjfc dans le forum Architecture
    Réponses: 0
    Dernier message: 30/05/2017, 15h41
  2. Fil d'ariane à partir d'un résultat de requête nested
    Par CaviarNAS dans le forum Langage
    Réponses: 3
    Dernier message: 14/12/2011, 19h18
  3. table comme résultat de requête
    Par nafnaf625 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/05/2005, 11h51
  4. Comparaison de résultats de requêtes
    Par Nyx de Tours dans le forum Requêtes
    Réponses: 7
    Dernier message: 31/07/2004, 15h49
  5. Trier aléatoirement un résultat de requête
    Par ang36 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/01/2004, 17h38

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