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 :

NOT NULL ENABLE et optimisation [11g]


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut NOT NULL ENABLE et optimisation
    Bonjour,
    J'utilise Oracle 11 et j'aimerais optimiser mes requêtes SQL en temps d'exécution :
    1 - Je dois entrer 10 millions de lignes dans une table Ta. Cette écriture ne se fera qu'une seule fois.
    2 - Puis je dois exécuter une cinquantaine de requêtes SQL différentes sur cette tables Ta reliées à d'autres via des JOIN.

    Je peux déclarer quelques colonnes de Ta avec la contrainte NOT NULL ENABLE et éventuellement avec des valeurs par défauts.

    Ces contraintes peuvent-elles me faire gagner du temps lors du remplissage de la table ou lors de mes requêtes SQL ?

  2. #2
    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
    Une contrainte NOT NULL peut, dans les cas favorables, permettre de répondre à la requête par le seul usage de l'index, c'est à dire sans consulter la table dont il dépend.
    C'est ce qu'on appelle un index couvrant : un index basé sur toutes les colonnes impliquées dans la requête.

    En l'absence de la contrainte NOT NULL, comme les index normaux (je précise monocolonnes pour contrer les pinailleurs à la Mnitu ou MHouri ) de type BTree ne stockent pas les valeurs nulles, on n'a pas la certitude de retrouver les données dans l'index, et on est donc forcé de passer par la table.

    Cela dit, une contrainte doit d'abord être fondée fonctionnellement. Si en plus elle permet d'améliorer les performances, c'est du bonus, mais ça ne peut pas être sa seule raison d'être.
    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

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

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

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

    Pom', tu peux étendre ton raisonnement aux indexes multi-colonnes, qui ne stockent que les entrées dont au moins une des colonnes est non nulle

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  4. #4
    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 pacmann Voir le message
    Pom', tu peux étendre ton raisonnement aux indexes multi-colonnes, qui ne stockent que les entrées dont au moins une des colonnes est non nulle
    C'est bien le sens de ma parenthèse...
    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

  5. #5
    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
    Ces contraintes peuvent-elles me faire gagner du temps lors du remplissage de la table ou lors de mes requêtes SQL ?
    Il y a une nouvelle optimisation des DDL en 11g (DDL optimisation). Qui permet d'éviter de faire un update de la valeur par défaut sur la table lorsque cette colonne est ajoutée. Uniquement son "méta data" est enregistré. Exemple
    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
     
    QL> drop table t;
     
    Table dropped.
     
    SQL> create table t as select rownum n1 from dual connect by level <= 1e4;
     
    Table created.
     
     
    SQL> alter table t add n2 number default 0 not null;
     
    Table altered.
     
     
    SQL> select count(1) from t where n2 = 42;
     
      COUNT(1)
    ----------
             0
     
    SQL> select * from table(dbms_xplan.display_cursor);
     
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |       |       |     9 (100)|          |
    |   1 |  SORT AGGREGATE    |      |     1 |    13 |            |          |
    |*  2 |   TABLE ACCESS FULL| T    |     1 |    13 |     9   (0)| 00:00:01 |
    ---------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       2 - filter(NVL("N2",0)=42)
     
    Note
    -----
       - dynamic sampling used for this statement (level=2)
    Avez-vous remarqué quelques choses?

    Sinon, observez alors très bien la partie prédicat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    2 - filter(NVL("N2",0)=42)
    Ceci ne correspond pas à la partie where clause de mon select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SQL> select count(1) from t where n2 = 42;
    Ceci vient du fait que la colonne n2 a été ajoutée sans être mise à jour accélérant ainsi le DDL.

    Par contre il existe un inconvénient à cela lors de vos "selects". Vous créez un index sur n2 et votre prédicat est changé en nvl(n2, 0). Ceci peut faire en sorte que votre index ne soit pas utilisé. Bien que dans ce cas il l'ait été pour moi. Mais ce n'est pas forcément le cas tous les jours.
    Bien Respectueusement
    www.hourim.wordpress.com

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

  6. #6
    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
    D’une manière générale l’ajout d’une contrainte implique une action (vérification) de plus et cela ne va pas avec l’amélioration des performances des inserts (remplissage). Mais cela implique également que les réponses que la base donne à vos questions peuvent être fausses et ça peut être très grave.

    D’autre part la présence des contraints permet à l’optimiseur surtout dans les dernières versions d’Oracle de transformer vos requêtes d’une manière parfois très efficace.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut Remplacer les valeurs Null ?
    Merci pour ces infos.

    En fait, je remplis la table Ta à partir d'un gros fichier "plat" (plusieurs Go) au format CSV et je me demande si la chasse aux valeurs Null en vaut la peine et permettrait de gagner du temps ( càd quelques heures !).
    J'ai l'impression que oui vu quelques essais, mais je n'en ai pas une totale certitude.
    Vos réponse me laissent penser que si cette action est facile, il vaut mieux ne pas s'en passer ?

    (Par exemple, si une valeur numérique manque, je peux mettre un -1 de convention sans difficulté quant au codage.)

  8. #8
    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
    Si les seules contraintes impliquées sont de type not null alors laisse-les en place et testez le chargement de votre table. Si vous dépassez le fenêtre de temps envisageable pour cette opération il y a des autres techniques d’optimisation de chargement qui peuvent être envisagées.

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

Discussions similaires

  1. mysql optimisation de requete "is not null"
    Par austin P. dans le forum Requêtes
    Réponses: 6
    Dernier message: 14/09/2010, 13h57
  2. [SQL] supprimer le "not null" à un type
    Par AnestheziE dans le forum SQL
    Réponses: 10
    Dernier message: 27/11/2003, 13h56
  3. Alter column => passer de NOT NULL à NULL
    Par JohnGT dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/10/2003, 11h16
  4. Réponses: 8
    Dernier message: 24/07/2003, 10h45
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07

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