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 :

Un bug intéressant de sous-requêtes Interbase / Firebird [Archives]


Sujet :

SQL Firebird

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 26
    Points : 393
    Points
    393
    Par défaut Un bug intéressant de sous-requêtes Interbase / Firebird
    Pour ceux qui rencontreraient ce bug, je poste ici sa description et sa solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DISTINCT C.NUMORDRE
    FROM A
          LEFT OUTER JOIN C ON 
         (C.NUMORDRE = A.NUMORDRE)
    WHERE (A.CARTE is null)
            AND (A.NUMORDRE  not in 
    (
    select  B.NUMORDRE 
    from B
     inner join D ON (D.REF = B.REF) AND (D.TAG = 1) 
    where (B.REF like 'A%') AND (B.NUMORDRE = A.NUMORDRE)
    )
    )
    me donne un résultat erroné (vide dans mon cas)

    alors que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT C.NUMORDRE
    FROM A
          LEFT OUTER JOIN C ON 
         (C.NUMORDRE = A.NUMORDRE)
    WHERE (A.CARTE is null)
            AND (A.NUMORDRE  not in 
    (
    select  B.NUMORDRE 
    from B
     inner join D ON (D.REF = B.REF) AND (D.TAG = 1) 
    where (B.NUMORDRE > 0) AND
     (B.REF like 'A%') AND (B.NUMORDRE = A.NUMORDRE)
    )
    )
    donne le bon résultat (une ligne dans mon cas)

    La différence entre les deux ? l'ajout de (B.NUMORDRE > 0) AND dans la clause where de la sous-requête.
    Cette condition toujours vraie a pour but de forcer le l'optimiseur de requête à produire un plan corect du join.

    En effet, dans le premier cas, le plan de la sous-requête était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLAN JOIN (ECRITURES_1 INDEX (RDB$FOREIGN106,RDB$FOREIGN111),EXERCICES_1 INDEX (RDB$18))
    alors que dans le second, il est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLAN JOIN (EXERCICES_1 NATURAL,ECRITURES_1 INDEX (KYECRITURESREFEXERCICE,RDB$FOREIGN106,RDB$FOREIGN111))
    Le truc vient de Ann Harrison, sur une page à entête Firebird.

    Mais ce qu'elle indique marche avec Interbase, mais pas avec Firebird (1.5).

    J'ajouterai qu'il s'agit bien d'un problème de plan, car, en mettant un bon plan explicite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT C.NUMORDRE
    FROM A
          LEFT OUTER JOIN C ON 
         (C.NUMORDRE = A.NUMORDRE)
    WHERE (A.CARTE is null)
            AND (A.NUMORDRE  not in 
    (
    select  B.NUMORDRE 
    from B
     inner join D ON (D.REF = B.REF) AND (D.TAG = 1) 
    where (B.REF like 'A%') AND (B.NUMORDRE = A.NUMORDRE)
    PLAN JOIN (B INDEX (RDB$FOREIGN111),D INDEX (RDB$18))
    )
    )
    on obtient aussi le résultat correct, et cette fois-ci aussi bien avec Interbase que Firebird.

    A noter que le problème vient de ce que B.REF est indexé, et que FB 1.5/IB 6, à tort, veut introduire cet index (RDB$FOREIGN106) dans la plan du join
    Henry
    TeamB-Fr

  2. #2
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Excellent !
    CV :
    - LinkedIn
    - Viadeo

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

Discussions similaires

  1. Tester si une transaction est active sous interbase firebird
    Par yaniss321 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 04/05/2010, 11h04
  2. [Débat] Choisir InterBase/Firebird ou Microsoft SQL-SERVER ?
    Par asenaici dans le forum Décisions SGBD
    Réponses: 90
    Dernier message: 19/03/2009, 20h51
  3. [IB 6, FireBird 1.5] SKIP dans les sous-requêtes
    Par Magnus dans le forum Langage SQL
    Réponses: 8
    Dernier message: 15/09/2005, 14h14
  4. Lenteur InterBase / Firebird avec delphi 7 sous XP
    Par obione dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/11/2004, 20h22
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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