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

SQL Firebird Discussion :

Requete SQL ne se termine jamais


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Par défaut Requete SQL ne se termine jamais
    Bonjour,

    J'ai un problème avec la requete suivante :
    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
    with T2 as (select 
    trim(REF_TURBINE_) as REF_TURBINE_,
    DATE_HEURE as DATE_HEURE,
    PUISS_ACTIVE_PRODUITE as PUISS_ACTIVE_PRODUITE,
    VITESSE_VENT_NACELLE as VITESSE_VENT_NACELLE from DATA_10MIN where NOM_PROJET='x'
    and DATE_HEURE between '05.05.2016 08:00:00' and '05.05.2016 10:00:00' and REF_TURBINE_='T5'),
    T3 as (select 
    trim(REF_TURBINE_) as REF_TURBINE__1,
    DATE_HEURE as DATE_HEURE_1,
    PUISS_ACTIVE_PRODUITE as PUISS_ACTIVE_PRODUITE_1,
    VITESSE_VENT_NACELLE as VITESSE_VENT_NACELLE_1 from DATA_10MIN where NOM_PROJET='x'
    and DATE_HEURE between '05.05.2016 08:00:00' and '05.05.2016 10:00:00' and REF_TURBINE_='T2'),
    T4 as (select 
    trim(REF_TURBINE_) as REF_TURBINE__2,
    DATE_HEURE as DATE_HEURE_2,
    PUISS_ACTIVE_PRODUITE as PUISS_ACTIVE_PRODUITE_2,
    VITESSE_VENT_NACELLE as VITESSE_VENT_NACELLE_2 from DATA_10MIN where NOM_PROJET='x'
    and DATE_HEURE between '05.05.2016 08:00:00' and '05.05.2016 10:00:00' and REF_TURBINE_='T4'),
    T5 as (select 
    trim(REF_TURBINE_) as REF_TURBINE__3,
    DATE_HEURE as DATE_HEURE_3,
    PUISS_ACTIVE_PRODUITE as PUISS_ACTIVE_PRODUITE_3,
    VITESSE_VENT_NACELLE as VITESSE_VENT_NACELLE_3 from DATA_10MIN where NOM_PROJET='x'
    and DATE_HEURE between '05.05.2016 08:00:00' and '05.05.2016 10:00:00' and REF_TURBINE_='T1') 
     
    select * from T2 full join T3 on T2.DATE_HEURE = T3.DATE_HEURE_1 full join T4 on T3.DATE_HEURE_1 = T4.DATE_HEURE_2 full join T5 on T4.DATE_HEURE_2 = T5.DATE_HEURE_3
    Voici le plan :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLAN JOIN (T5 DATA_10MIN INDEX (I_DATA_10MIN_PRJT_DT_TRBN), JOIN (T4 DATA_10MIN INDEX (I_DATA_10MIN_PRJT_DT_TRBN), JOIN (T3 DATA_10MIN INDEX (I_DATA_10MIN_PRJT_DT_TRBN), T2 DATA_10MIN INDEX (I_DATA_10MIN_PRJT_DT_TRBN))))

    Lorsque la plage de date est de quelques heures ca fonctionne mais si je mets 1 jour elle ne se termine jamais. Comment pourrais je l'améliorer?

    Merci

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

    Quels sont les volumes à traiter et quelle est la description des index

    De plus,

    - formatez vos requêtes, c'est pénible de lire des requetes écrites à la volée
    - il eut été plus simple de nommer vos CTE en cohérence avec votre filtre sur REF_TURBINE : CTE T2=filtre T5, CTE T3=filtre T2 etc... c'est un peu tordu

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Par défaut
    Par jour la table DATA_10MIN contient environ 800 enregistrements.
    L'index est fait sur NOM_PROJET, DATE_HEURE, REF_TURBINE_

    Désolé pour la mise en forme

    Merci

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 681
    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 681
    Billets dans le blog
    10
    Par défaut
    Pour la mise en forme des requetes il existe des outils gratuits, exemple : http://sqlformat.org/

    Vos colonnes date_heure sont bien de format timestamp, ce ne sont pas des char ou varchar ou autre format inapproprié ?

    Si oui, postez votre requete qui dure longtemps, et le DDL des tables et index
    Si non, corrigez ou faites corriger (dans la mesure du possible) vos colonnes pour utiliser des formats appropriés, date ou timestamp selon la précision souhaitée

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Par défaut
    Oui les champs date_heure sont bien des timestamp. Je regarde pour les DDL
    Merci pour le lien c'est pratique!

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 708
    Billets dans le blog
    65
    Par défaut
    Bonsoir,

    moi, en plus de la cohérence entre nom de CTE et Ref_Trurbine, ce qui me gène c'est le Full des jointures
    en fait , j'ai du mal à cerner l'objectif de ce SQL et me demande si une procédure ou une requête recursive ne serait pas plus appropriée

    de plus : à qui servent les TRIM ? les AS des colonnes alors que si le SELECT final n'était pas un SELECT * mais un SELECT indiquant les colonnes ...
    Bref ce SQL ressemble à une sorte de LIST sans en être un je me trompe ?

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 131
    Par défaut
    Salut à tous.

    Je n'arrive pas à comprendre, ce sujet existe depuis le 02 juin 2016, et je n'ai pas reçu aucune alerte, sauf aujourd'hui.
    Comment faites-vous pour intervenir dans un sujet, sauf en venant consulter le forum ?

    En ce qui concerne la requête de "calou_33", je ne comprends pas trop l'intérêt de faire aussi compliqué.

    Voici en FireBird, la requête proposé par Escartefigue.
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    -- =================================
    -- Création de la table 'DATA_10MIN'
    -- =================================
     
    CREATE TABLE DATA_10MIN (
    NOM_PROJET              VARCHAR(10)  NOT NULL collate fr_fr,
    REF_TURBINE             VARCHAR(10)  NOT NULL collate fr_fr,
    DATE_HEURE              TIMESTAMP    NOT NULL,
    PUISS_ACTIVE_PRODUITE   INTEGER      NOT NULL,
    VITESSE_VENT_NACELLE    INTEGER      NOT NULL
    );
     
    -- ===========================
    -- Insertion dans 'DATA_10MIN'
    -- ===========================
     
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T1','2016-05-05 08:01:00',186, 10);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T1','2016-05-05 08:15:00',175, 15);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T2','2016-05-05 08:01:00',255, 11);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T2','2016-05-05 08:22:00',022, 14);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T3','2016-05-05 08:01:00',075,  0);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T3','2016-05-05 08:22:00',432, 17);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T4','2016-05-05 08:22:00',128, 12);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T4','2016-05-05 08:15:00',133, 23);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T5','2016-05-05 08:01:00',105, 33);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T5','2016-05-05 08:15:00',017, 18);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T6','2016-05-05 08:22:00',177, 13);
    insert into data_10min (nom_projet,ref_turbine,date_heure,puiss_active_produite,vitesse_vent_nacelle) values ('x','T6','2016-05-05 08:15:00',205, 27);
     
    -- ======================
    -- Vidage de 'data_10min'
    -- ======================
     
    select * from data_10min;
     
    NOM_PROJET REF_TURBINE                DATE_HEURE PUISS_ACTIVE_PRODUITE VITESSE_VENT_NACELLE
    ========== =========== ========================= ===================== ====================
    x          T1          2016-05-05 08:01:00.0000                    186                   10
    x          T1          2016-05-05 08:15:00.0000                    175                   15
    x          T2          2016-05-05 08:01:00.0000                    255                   11
    x          T2          2016-05-05 08:22:00.0000                     22                   14
    x          T3          2016-05-05 08:01:00.0000                     75                    0
    x          T3          2016-05-05 08:22:00.0000                    432                   17
    x          T4          2016-05-05 08:22:00.0000                    128                   12
    x          T4          2016-05-05 08:15:00.0000                    133                   23
    x          T5          2016-05-05 08:01:00.0000                    105                   33
    x          T5          2016-05-05 08:15:00.0000                     17                   18
    x          T6          2016-05-05 08:22:00.0000                    177                   13
    x          T6          2016-05-05 08:15:00.0000                    205                   27
     
     
    -- ============
    -- Requête N° 1
    -- ============
     
    select date_heure,
           ref_turbine,
           puiss_active_produite,
           vitesse_vent_nacelle
     
    from data_10min
     
    where nom_projet = 'x'
      and ref_turbine in ('T1','T2','T4','T5')
      and date_heure between '2016-05-05 08:00:00' and '2016-05-05 10:00:00'
     
    order by date_heure, ref_turbine
    ;
     
                   DATE_HEURE REF_TURBINE PUISS_ACTIVE_PRODUITE VITESSE_VENT_NACELLE
    ========================= =========== ===================== ====================
    2016-05-05 08:01:00.0000  T1                            186                   10
    2016-05-05 08:01:00.0000  T2                            255                   11
    2016-05-05 08:01:00.0000  T5                            105                   33
    2016-05-05 08:15:00.0000  T1                            175                   15
    2016-05-05 08:15:00.0000  T4                            133                   23
    2016-05-05 08:15:00.0000  T5                             17                   18
    2016-05-05 08:22:00.0000  T2                             22                   14
    2016-05-05 08:22:00.0000  T4                            128                   12
     
     
    -- ============
    -- Requête N° 2
    -- ============
     
     
    with cte as (
        select date_heure,
     
               max(case ref_turbine when 'T1' then puiss_active_produite else null end) as puiss_active_produite_t1,
               max(case ref_turbine when 'T2' then puiss_active_produite else null end) as puiss_active_produite_t2,
               max(case ref_turbine when 'T4' then puiss_active_produite else null end) as puiss_active_produite_t4,
               max(case ref_turbine when 'T5' then puiss_active_produite else null end) as puiss_active_produite_t5,
     
               max(case ref_turbine when 'T1' then vitesse_vent_nacelle  else null end) as vitesse_vent_nacelle_t1,
               max(case ref_turbine when 'T2' then vitesse_vent_nacelle  else null end) as vitesse_vent_nacelle_t2,
               max(case ref_turbine when 'T4' then vitesse_vent_nacelle  else null end) as vitesse_vent_nacelle_t4,
               max(case ref_turbine when 'T5' then vitesse_vent_nacelle  else null end) as vitesse_vent_nacelle_t5
     
        from data_10min
     
        where nom_projet = 'x'
          and ref_turbine in ('T1','T2','T4','T5')
          and date_heure between '2016-05-05 08:00:00' and '2016-05-05 10:00:00'
     
        group by date_heure
        order by date_heure
    )
     
    select * from cte;
     
                   DATE_HEURE PUISS_ACTIVE_PRODUITE_T1 PUISS_ACTIVE_PRODUITE_T2 PUISS_ACTIVE_PRODUITE_T4 PUISS_ACTIVE_PRODUITE_T5 VITESSE_VENT_NACELLE_T1 VITESSE_VENT_NACELLE_T2 VITESSE_VENT_NACELLE_T4 VITESSE_VENT_NACELLE_T5
    ========================= ======================== ======================== ======================== ======================== ======================= ======================= ======================= =======================
    2016-05-05 08:01:00.0000                       186                      255                   <null>                      105                      10                      11                  <null>                      33
    2016-05-05 08:15:00.0000                       175                   <null>                      133                       17                      15                  <null>                      23                      18
    2016-05-05 08:22:00.0000                    <null>                       22                      128                   <null>                  <null>                      14                      12                  <null>
     
     
    exit
    Expected end of statement, encountered EOF
     
    Appuyez sur une touche pour continuer...
    @+

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 708
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par Artemus24 Voir le message
    Je n'arrive pas à comprendre, ce sujet existe depuis le 02 juin 2016, et je n'ai pas reçu aucune alerte, sauf aujourd'hui.
    Comment faites-vous pour intervenir dans un sujet, sauf en venant consulter le forum ?
    la deuxième solution pour moi, en début de journée, vers midi et selon mes humeurs l'après-midi

    Citation Envoyé par Artemus24 Voir le message
    je ne comprends pas trop l'intérêt de faire aussi compliqué.
    je sais que je propose plus compliqué mais c'est parce que depuis le début je trouve la solution trop restrictive :
    - si un autre projet (vous remarquerez que l'on est passé du projet 'x' au projet 'xs' à un moment) ou si l'on ajoute une nouvelle turbine tout est à refaire
    - le cas aucune données pour les turbines à un moment T n'est pas prévu (d'où la proposition de partie récursive)
    bref je voulais faire quelque chose de plus générique :
    "avoir un tableau des activités des turbines toutes les 10 minutes pour un projet donné"


    si je m'étais contenté du départ j'aurais certainement proposé quelque chose comme la proposition de aieeeuuuuu


    Quant à la partie finale (présentation des résultats sur une seule ligne) elle devrait se faire par "cross tabulation" ce n'est pas implémenté avec la version 2.5 et je n'ai fait aucune recherche à ce sujet pour la version 3 (si un retraité a le temps )
    ceci étant avec la version 2.5 la crosstabulation est réalisable avec quelques procédures et table temporaire

  9. #9
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 131
    Par défaut
    Salut SergioMaster.

    Je vais devoir intervenir directement sur le forum, au lieu d'attendre l'email récapitulatif de la journée envoyé à 0H03.

    Citation Envoyé par Artemus24
    En ce qui concerne la requête de "calou_33", je ne comprends pas trop l'intérêt de faire aussi compliqué.
    Je ne m'adressais pas à toi, SergioMaster, mais à calou_33.
    Je ne comprends pas trop l'intérêt de sa requête.

    En ce qui te concerne, oui, en effet, ta proposition est plus riche.
    C'est la finalité qui m'intéresse et non m'attarder sur un problème ponctuel, difficile à résoudre.

    @+

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

Discussions similaires

  1. [SQL 2005] Requetes ne se termine jamais
    Par lanjolanjo dans le forum Administration
    Réponses: 2
    Dernier message: 16/06/2009, 22h46
  2. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 10h31
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 17h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 12h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 14h43

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