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

DB2 Discussion :

(not) EXISTS et Fetch first 1 rows only


Sujet :

DB2

  1. #1
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut (not) EXISTS et Fetch first 1 rows only
    Bonjour,

    Chez un client DB2 V11 for Z/OS, un DBA préconise d'ajouter la clause "fetch first 1 rows only" dans les test d'existence (where exists/not exists)
    Je suis très surpris par cette préconisation : dans la mesure où le test d'existence répond par un booléen, et sauf erreur de ma part, arrête la lecture quoi qu'il arrive dès le 1er enregistrement trouvé, quel pourrait être l'intérêt de cette clause ?

  2. #2
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut precision avec NOT EXISTS
    L'explain est ton ami.

    reste que certaines "normes" ont été prises il y a plusieurs années (eq plusieurs versions de db2) et il faut savoir argumenter pour le respect (ou pas) de ces "normes" (vu & vécu il y a qques jours).

    Db2 est capable d'optimiser les requêtes qui lui sont présentées. Ca ne marche pas toujours; mais la fiabilité de l'optimization est de 99.9999%.
    EXISTS a été bien optimisé. Les discussions entre "EXISTS (select * ..." et "EXISTS (SELECT 1 ...." ne sont plus d'actualité.

    La lecture de tous les redbooks de la Vxx à la V11 devrait s'imposer.

    Perso; moins j'en met dans une requête; mieux ca marche. En respectant le schema de données (eq passer par les index uniques).

    Si ca fait plaisir au chef; fait lui plaisir.. Avec des arguments...........
    a+

    Gaffe, avec "NOT EXISTS" le résultat ne sera pas du tout le même.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour Bernard et merci pour cette réponse,

    L'explain est mon ami, certainement, d'ailleurs j'en use et en abuse sur plate formes environnements bas, mais l'explain n'a qu'une valeur prédictive extrêmement dépendante des statistiques de la plate-forme où il est exécuté.

    Or, je n'ai pas les droits sur la prod ni sur une autre plate forme avec des volumes similaires pour faire des explain.
    Et faire une demande de relevé de perfs réelles avec des outils genre strobe nécessite de passer par 15 formulaires et autant de niveaux hiérarchiques

    Concernant le select * ou autre dans un exists, même si dans les faits ça ne change rien, je suis personnellement partisan de l'utilisation d'une constante (ex : select 1, select 'A' peu importe) car ça a le mérite de lever toute ambiguïté sur le principe de fonctionnement : le résultat est un booléen et non une table.

    Mais ma question concerne bien uniquement la clause "fetch first 1 row only" dans un exists, quelque soit le choix de coder select *, select 1 ou autre dans le subquery d'existence.
    Les red books n'éclaircissent pas complètement ce point particulier ni la doc DB2V11 :
    Ce qui est clair dans les docs DB2, c'est que cette clause "fetch first n rows only" permet d'optimiser l'espace de la table résultante d'une requete. Or, une requete de type exists n'utilise pas de table résultante. Du coup, on peut supposer que la clause est inutile dans ce contexte.
    Mais entre supposer et affirmer ... je voudrai être certain de n'avoir pas loupé un argument

Discussions similaires

  1. FETCH FIRST x ROWS ONLY
    Par mcralcv dans le forum DB2
    Réponses: 1
    Dernier message: 05/05/2012, 15h45
  2. "fetch first 1 rows only" dans un "Left Join"
    Par nico.exe dans le forum DB2
    Réponses: 5
    Dernier message: 02/04/2012, 16h25
  3. FETCH FIRST xx ROWS ONLY
    Par SuperWaza dans le forum DB2
    Réponses: 5
    Dernier message: 25/09/2009, 09h59
  4. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  5. [JCreator] "package tools does not exists"
    Par snyper147 dans le forum Environnement de Développement Intégré (EDI)
    Réponses: 2
    Dernier message: 04/05/2003, 20h08

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