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 Oracle Discussion :

Sans risque ?


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Sans risque ?
    Bonjour,

    Je travaille sur un ERP qui livre en standard des vues de ce type :

    Code sql : 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
     
    create view mavue (
      col1, col2, col3, col4, col5, col6
    )
    as
    select table1.col1, table1.col2, table2.col3, table2.col4, table3.col5, table3.col6
    from table1, table2, table3
    where table2.id = table1.fk_table2
    and table3.id = table1.fk_table3
    union all
    select table1.col1, table1.col2, table2.col3, table2.col4, ' ', ' '
    from table1, table2
    where table2.id = table1.fk_table2
    and not exists (
      select 1
      from table3
      where table3.id = table1.fk_table3
    );

    Vu que ça me fait froid dans le dos à chaque fois que je tombe dessus, et que je dois les dériver pour les personnaliser, je souhaite les réécrire de cette façon :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create view mavue (
      col1, col2, col3, col4, col5, col6
    )
    as
    select table1.col1, table1.col2, table2.col3, table2.col4, coalesce(table3.col5, ' '), coalesce(table3.col6, ' ')
    from table1
    inner join table2 on table2.id = table1.fk_table2
    left outer join table3 on table3.id = table1.fk_table3;

    Est-ce que je risque quoi que ce soit :
    - en terme de données (pour moi, les deux écritures sont strictement équivalentes en terme de résultat, mais je voudrais en être certain)
    - en terme de performances (pour moi, la nouvelle syntaxe est plus rapide, mais comment en être sûr ?)

    Ces vues tournent sous Oracle 11gR2.

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    oui, tu risques d'avoir des résultats différents. Moi je laisserais la requête telle quelle !

    et tu risques aussi d'avoir une moins bonne performance si ton ERP utilise des HINT qui s'adresse à la vue origininale

  3. #3
    Membre éprouvé
    Inscrit en
    Septembre 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 82
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    oui, tu risques d'avoir des résultats différents. Moi je laisserais la requête telle quelle !

    et tu risques aussi d'avoir une moins bonne performance si ton ERP utilise des HINT qui s'adresse à la vue origininale
    Ce serait quand même un peu idiot de coder des HINTs en dur dans un ERP non? Moi je trouve les HINTs utiles au niveau du développement et du tuning des requêtes mais une fois en production, les systèmes ne devraient pas contenir des hints. C'est comme si on disait à l'optimiseur "Ecoute, je sais mieux que toi ce que tu fais, je te force à le faire ainsi". Mais les données évoluent. Peut-être qu'un certains HINT pourrait être utile à un certain moment, mais les données évoluent et peut-etre que ce hint dégraderait les performances 15 jours plus tard. Les systèmes aussi évoluent...

  4. #4
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut,

    En parlant de truc potentiellement idiot, on a quand même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    AND NOT EXISTS (
      SELECT 1
      FROM table3
      WHERE table3.id = table1.fk_table3
    );
    Je sais que je devrais pas interpréter hativement... mais ça donne quand même l'impression que la fk sur table3 peut ne pas être dans table3

    Sinon sur les performances, on ne peut rien conclure. Il se pourrait même que cette requête soit une réécriture de celle proposée StringBuilder afin de résoudre un problème de perfs

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Je sais que je devrais pas interpréter hativement... mais ça donne quand même l'impression que la fk sur table3 peut ne pas être dans table3
    C'est vrai que s'il s'agit d'une vraie Foreign Key, on pourrait se dispenser de faire cet EXISTS et juste vérifier table1.fk_table3 IS NULL.

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    la requete 1 pourrait retourner des valeurs nulles de table3.col5, alors que la requete 2 ne retournera pas de nul

    ensuite, il n'y a rien d'idiot a employer des hints. Les gros ERP, style SAP, Siebel, Peoplesoft, ont optimiser a leur facon les requetes et les reecrire n'est generalement pas supporte.

    Contacte ton fournisseur ERP et propose-lui ton amelioration

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    ...
    - en terme de performances (pour moi, la nouvelle syntaxe est plus rapide, mais comment en être sûr ?)
    Chez Oracle c’est un mythe. Mais juste par curiosité, dite moi que est-ce que vous faite pensez que la syntaxe ANSI pouvait être plus rapide ?

    Oui je trouve aussi les deux écritures équivalentes.

  8. #8
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Chez Oracle c’est un mythe. Mais juste par curiosité, dite moi que est-ce que vous faite pensez que la syntaxe ANSI pouvait être plus rapide ?
    Il ne s'agit pas ici de dire que la syntaxe ANSI est plus rapide, mais de dire que procéder à une requête sur les tables T1, T2 et T3, puis (avec union all) à une requête sur T1 et T2 dans le cas où il n'y aurait pas de correspondance avec T3, semble être plus lent que faire directement une requête sur T1, T2 et T3 en ouvert - les tables vont être accédées 2 fois au lieu d'une seule.

  9. #9
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Oui c'est ça Rei Ichido, le UNION me pose un sérieux problème, ce n'est pas seulement l'écriture des jointures qui me gêne.

  10. #10
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Sur le papier, la requête a bien l'air équivalente. Cela dit, à l'instar de Laurent Schneider, le risque de régression me semble non négligeable, surtout si vous le faites sur beaucoup de vues (une erreur est vite arrivée).
    En ce qui concerne le risque par rapport aux hints, là pour le coup j'y crois moyennement, d'une part parce que quand les requêtes sont mal écrites, les hints sont relativement rares (et pas forcément adaptés), d'autre part parce que en plus l'utilisation des hints avec des vues n'est pas aisée :

    Citation Envoyé par Oracle
    Using Hints Against Views

    By default, hints do not propagate inside a complex view. For example, if you specify a hint in a query that selects against a complex view, then that hint is not honored, because it is not pushed inside the view.

    Note:
    If the view is a single-table, then the hint is not propagated.

    Unless the hints are inside the base view, they might not be honored from a query against the view.

  11. #11
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    En ce qui concerne le risque par rapport aux hints, là pour le coup j'y crois moyennement, [...] parce que en plus l'utilisation des hints avec des vues n'est pas aisée
    Pas si compliquée quand même en 11g avec les Query Blocks :

    http://jonathanlewis.wordpress.com/2007/06/25/qb_name/
    http://blog.easyteam.fr/2012/10/11/o...nant-des-vues/

Discussions similaires

  1. Peut on compresser un dump sans risques ?
    Par ukanoldai dans le forum Import/Export
    Réponses: 20
    Dernier message: 14/05/2008, 10h47
  2. Puis-supprimer les doublons de ma base sans risque?
    Par kervano dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/03/2008, 13h51
  3. Puis-je désactiver ce service sans risque?
    Par Catal13 dans le forum Windows XP
    Réponses: 2
    Dernier message: 23/05/2007, 08h58
  4. [Loader] Comment mettre à jour sans risque
    Par cosmos38240 dans le forum Oracle
    Réponses: 4
    Dernier message: 15/11/2006, 16h23

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