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

Langage SQL Discussion :

Problème de dépassement du tps vérouillage avec une requête


Sujet :

Langage SQL

  1. #1
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut Problème de dépassement du tps vérouillage avec une requête
    Bonjour

    J'ai un programme delphi qui effectue de nombreuses requêtes sur sql server mais arrivé à une certaine requête j'ai le droit à un message d'erreur de type : Dépassement du temps de connexion à sql server, dépassement du temps de vérouillage.
    J'ai essayé de tester 1 partie de ma requête dans l'analyseur de requête mais ca fait plus de 10min que ca tourne et toujours pas de résultat.

    Voici la requête en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select count(hexavia.HEX_CLE) as CPT, IDTABLE from hexavia, tabtravficfusion
    where NINSEE = INSEE and   MOTDIR = MOTCLEVOIE
    and   tabtravficfusion.TYPEVOIE  = presse.dbo.F_TakeTypeVoie(hexavia.LIBVOIE)
    group by IDTABLE
    Si quelqu'un avait une idée de la cause de mon problème...

    Merci

    Edité par Barbibulle :

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Si vous nous dites pas pourquoi celà vous étonnes c'est difficile de vous aider.

    Il n'y a pas beaucoup de données ? Combien ? etc...

    Sinon vous pouvez essayer de déterminer quel est le critère qui est long :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select hexavia.HEX_CLE, IDTABLE from hexavia, tabtravficfusion 
    where NINSEE = INSEE and   MOTDIR = MOTCLEVOIE 
    and   tabtravficfusion.TYPEVOIE  = presse.dbo.F_TakeTypeVoie(hexavia.LIBVOIE)
    ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select hexavia.HEX_CLE as CPT, IDTABLE from hexavia, tabtravficfusion 
    where NINSEE = INSEE and   MOTDIR = MOTCLEVOIE
    ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select hexavia.HEX_CLE IDTABLE from hexavia, tabtravficfusion 
    where tabtravficfusion.TYPEVOIE  = presse.dbo.F_TakeTypeVoie(hexavia.LIBVOIE)
    ?

  3. #3
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    une de mes tables contient 44000 enregistrements et l'autre plus d'un million.
    N'y aurait il pas une forme d'écriture différente qui permettrait d'accélérer le temps d'execution de la requête ?

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Pour faire de l'optimisation de requete il faut connaitre la structure des deux tables, les indexes/cle etrangère/cle primaire de chacune d'elles et le nombre d'enregistrement etc...


    Et il serait bien comme je vous l'ai dit précédemment que vous identifiez le critère qui rend la requete lente.

  5. #5
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    Le simple fait de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select presse.dbo.F_TakeTypeVoie(hexavia.LIBVOIE) from hexavia
    est déjà très long car la table hexavia contient 2 millions d'enregistrements. Il y a bien un index sur LIBVOIE.

    Je pense qu'il faut que je procède autrement car ma table est vraiment énorme et la jointure ne doit pas arranger le temps d'execution.

    Merci pour l'aide

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Je me doutais que c'était ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    presse.dbo.F_TakeTypeVoie(hexavia.LIBVOIE)
    Si je ne me trompe c'est une procédure, reste à savoir ce qu'il y a dedans qui la rend si longue...

  7. #7
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    C'est une fonction que j'ai écrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE  Function F_TakeTypeVoie (@ENTREE varchar(50))
    returns varchar(50)
    as
    begin
      declare @type varchar(50)
     
      set @type = (select TYPEVOIECOURT from presse.dbo.TypeVoie where TYPEVOIE = presse.dbo.F_TakeFirstWord(@ENTREE))
      if @type = null set @type = ''
     
      return ltrim(rtrim(@type))
    end
    F_TakeFirstWord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE    Function F_TakeFirstWord (@ENTREE varchar(50))
    returns varchar(50)
    as
    begin
      declare @S varchar(50)
      set @S = rtrim(ltrim(@ENTREE))+' '
      return(left(@S,charindex(' ',@S)))
    end

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Oui donc il execute une sous requete pour chaque enregistrement de votre requete principale, ce qui est assez lourd.

    Donc en effet il serait plus économique de faire une jointure plutot qu'une sous requete corélé.

    Que donne cette requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select count(hexavia.HEX_CLE) as CPT, IDTABLE from hexavia, tabtravficfusion,  TypeVoie
    where NINSEE = INSEE and   MOTDIR = MOTCLEVOIE 
    and tabtravficfusion.TYPEVOIE  = TypeVoie.TYPEVOIECOURT 
    and presse.dbo.F_TakeFirstWord(hexavia.LIBVOIE)) = TypeVoie.TYPEVOIE
    group by IDTABLE
    NB : trim n'existe pas ?? (remplacerait vos ltrim(rtrim(x)) )
    NB2 : Pourquoi vous n'utilisez pas l'écriture des jointures normalisée ? (INNER JOINT)

  9. #9
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Barbibulle
    NB2 : Pourquoi vous n'utilisez pas l'écriture des jointures normalisée ? (INNER JOINT)
    Par ce que ce n'est pas portable sous ORACLE en dessous de la V9
    OK je

  10. #10
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    merci je vais tester ca

    pour trim la fonction n'existe pas sous sql server

    pour ce qui est des jointures j'ai appris ca comme ca plutôt qu'avec des INNER JOIN (c'est possible que j'ai appris le sql sur une version d'oracle antérieur à la 9 comme dit papounet)

  11. #11
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Il faut utiliser le plus possible la norme pour plusieurs raisons :

    Ca rend le SQL plus compatible avec les autres SGBD
    Ca permet une maintenance plus aisée par d'autres personnes
    Et dans ce cas précis c'est plus facile à lire.

    Car un select comme celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select T1.colonne , T2.Colonne
    from Table1 T1
    inner join Table2 T2 on T2.FK_ID=T1.ID
    where T1.Nom='...' and T2.Tel is null
    Permet au lecteur de facilement dissocier les critères de selection (derrière le where) des conditions de jointure.
    Autant les critères peuvent changer (évoluer) autant les jointures elles évoluent peu car basées le plus souvant sur l'identifiant de la table lié à une clé étrangère de l'autre table.

  12. #12
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    je viens de tester et c'est en effet nettement plus rapide ! (27 sec)

    Merci beaucoup pour l'aide et le tuyau

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/06/2015, 09h04
  2. Problème pour lier un valeur saisie avec une requête.
    Par jejeapollo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/08/2007, 12h56
  3. Problème avec une requête
    Par ringostarr dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/04/2005, 20h34
  4. Problème avec une requête
    Par snoopy69 dans le forum Débuter
    Réponses: 2
    Dernier message: 20/01/2005, 12h39
  5. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29

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