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 :

Performance de SQL dynamique


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Points : 25
    Points
    25
    Par défaut Performance de SQL dynamique
    Bonjour,

    Est ce que le SQL dynamique permet d'ameliorer l performance? et comment?

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Ceci répond-t-il a votre besoin ?

    (Pensez à développer vos besoins/demandes.)

    Cordialement,
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    A requête équivalente non.
    Mal codé il détruit les performances en plus d'être source d'injection SQL.

    Le SQL dynamique permet d'exécuter une requête construite dynamiquement à partir d'une chaîne (une concaténation de chaînes) de caractères comme fonctionnent les language client (php, java...)
    Voici un exemple où l'approche sql dynamique permet un gain de performance comparée à l'approche sql statique :
    Making a genric search sql Query

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Points : 25
    Points
    25
    Par défaut
    skuatamad; le document lié est trés long de façon que j ai pas pu trouvé mon besoin:

    aussi, j ai pas compris ce que t'as ecris:
    A requête équivalente non.
    Mal codé il détruit les performances en plus d'être source d'injection SQL.

  5. #5
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    En PL/SQL, avant Oracle 10g le SQL dynamique était toujours moins performant que le SQL statique. Suite aux divers optimisations apportées au PL/SQL à partir d’Oracle 10g il n’y plus une différence notable entre les requêtes dynamiques et statiques. Néanmoins utiliser du SQL dynamique à la place du SQL statique dans PL/SQL est une erreur au moins pour le fait qu’il détruit le mécanisme des dépendances.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Points : 25
    Points
    25
    Par défaut
    merci mnitu,

    mais j ai pas compris:
    Néanmoins utiliser du SQL dynamique à la place du SQL statique dans PL/SQL est une erreur au moins pour le fait qu’il détruit le mécanisme des dépendances.

  7. #7
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Regardez cet exemple, la base n’enregistre qu’une seule fonction qui dépende de la table hr.employees!
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> create or replace function get_name_for_id (
      2    employee_id     In Number
      3  ) Return varchar2 Is
      4    l_name Varchar2(100);
      5  Begin
      6    Select e.first_name
      7      Into l_name
      8      From hr.employees e
      9     Where e.employee_id = get_name_for_id.employee_id;
     10     --
     11     Return l_name;
     12  End;
     13  /
     
    Function created
    SQL> create or replace function get_name_for_id_dyn (
      2    employee_id     In Number
      3  ) Return varchar2 Is
      4    l_name Varchar2(100);
      5    l_sql Constant Varchar2(100) := 'Select e.first_name '
      6                                    ||'From hr.employees e '
      7                                    ||'Where e.employee_id = :employee_id';
      8  Begin
      9    Execute Immediate l_sql Into l_name;
     10    Return l_name;
     11  End;
     12  /
     
    Function created
    SQL> Select name
      2    from all_dependencies d
      3   Where d.referenced_owner = 'HR'
      4     And d.referenced_name = 'EMPLOYEES'
      5     And d.type = 'FUNCTION'
      6  /
     
    NAME
    ------------------------------
    GET_NAME_FOR_ID
     
    SQL>

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par mnitu Voir le message
    En PL/SQL, avant Oracle 10g le SQL dynamique était toujours moins performant que le SQL statique. Suite aux divers optimisations apportées au PL/SQL à partir d’Oracle 10g il n’y plus une différence notable entre les requêtes dynamiques et statiques. Néanmoins utiliser du SQL dynamique à la place du SQL statique dans PL/SQL est une erreur au moins pour le fait qu’il détruit le mécanisme des dépendances.
    Le SQL Statique (PL/SQL) a l'avantage d'utiliser automatiquement les "bind variables". Il est fait ainsi. Un genre "d'auto binding" est introduit dans le moteur PL/SQL statique si bien que tout ce que vous mettez comme variable, en dur ou pas, elle sera "re-bindée" (Désolé pour les termes en anglais). Vous avez donc l'énorme avantage de soulager la mémoire (library cache du shared pool) sans déployer d'effort spécifique à ce sujet. Par contre, lorsque vous utilisez du SQL Dynamique dans du PL/SQL (procédure), vous devez vous même veiller à la bonne utilisation des "bind-variables". Ce qui ôte déjà un sérieux avantage par rapport au SQL statique.

    De plus, qui dit SQL dynamique dit peut-être une faille dans la sécurité à cause du SQL injection. D’une manière générale, moi je conseille de:

    1. N’utiliser le SQL dynamique que lorsque le SQL statique n’est pas possible
    2. Lorsque vous utilisez le SQL dynamique veillez à bien utiliser les variables de liaison (ouf j’ai fini par utiliser le terme en français)
    3. Lorsque vous utilisez le SQL dynamique faites attention au SQL injection (utilisation des concaténations et absence de variables de liaison)
    4. Lorsque vous utilisez le SQL dynamique pensez à tracer le texte du code SQL généré avant son utilisation. Il vous sera très facile de débugger les différentes erreurs obtenues lors de l’exécution et non lors de la compilation


    cursor sharing and bind variable
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  9. #9
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    ... ouf j’ai fini par utiliser le terme en français...
    Bravo, il était temps !!! Ça va, pas trop de furoncles qui poussent ?
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  10. #10
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Points : 25
    Points
    25
    Par défaut
    bravo et merci Mohamed.Houri pour ton explication

    mais s'il est possible d'expliquer la notion de SQL injection.

    merci d'avance

  11. #11
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Le SQL Statique (PL/SQL) a l'avantage d'utiliser automatiquement les "bind variables".
    ...
    Le moteur PL/SQL implémente beaucoup des automatisations favorables au programmeur.

    [Edit+]
    Il suffit d’écrire correctement le code dynamique comme vous le suggérez pour retrouver la sérénité du « library cache » et de se protéger contre les injections. D’ailleurs si vous utilisez les autres langages vous n’avez pas le choix. Mais dans l’analyse des différances entre le SQL statique est dynamique je trouvé des autres aspects sont bien prioritaire. Voilà un autre exemple qui illustre pourquoi il ne faut pas abuser des SQL dynamique.

    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> CREATE OR REPLACE FUNCTION get_name_for_id_dyn1 (
      2    employee_id     IN Number
      3  ) RETURN varchar2 IS
      4    l_name Varchar2(100);
      5    l_sql Constant Varchar2(100) := 'En dynamique le requête SQL n''est pas analysée jusqu''à la exécution ';
      6  Begin
      7    Execute Immediate l_sql INTO l_name;
      8    RETURN l_name;
      9  End;
     10  /
     
    Function created
     
    SQL> show err
    No errors for FUNCTION MNI.GET_NAME_FOR_ID_DYN1
     
    SQL>

  12. #12
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par haykelFST Voir le message
    ...
    'il est possible d'expliquer la notion de SQL injection.

    merci d'avance
    Overview of SQL Injection Techniques

    INJECTION SQL

Discussions similaires

  1. Prob SQL dynamique
    Par anthony8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/09/2004, 09h53
  2. Appel de function en SQL Dynamique
    Par dkd dans le forum Oracle
    Réponses: 22
    Dernier message: 28/09/2004, 18h01
  3. SQL dynamique : pb de syntaxe
    Par Pasiphae dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/08/2004, 16h50
  4. SQL dynamique
    Par Etienne1 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/08/2004, 10h18
  5. SQL Dynamique - Materialized view
    Par Simeans2004 dans le forum SQL
    Réponses: 15
    Dernier message: 10/06/2004, 17h56

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