18 juin 2017

Le produit cartésien n'est pas le MAL mais quand peut-on l'utiliser?

          IntroductionOn vous a dit, re-dit et re-re-dit que le produit cartésien (ou produit en croix) c'était le mal, que c'était à éviter à tout prix car cette absence de jointure retourne des enregistrements en trop et que ça monopolisait trop de ressources serveur, au point de parfois le mettre à genoux.OK, mais dans quel cas peut-on faire un produit cartésien sachant que ce n'est pas interdit en SQL et qu'il y a même un opérateur dédié à cette opération, appelé CROSS JOIN? C'est le... [Lire la suite]
Posté par David DBA à 11:31 - - Commentaires [0] - Permalien [#]
Tags : , ,

08 juin 2017

Plan d'exécution : ce n'est pas la ligne la plus indentée qui est exécutée en premier

IntroductionUn plan d'exécution Oracle peut rapidement devenir incompréhensible dès qu'il comporte des dizaines de lignes. On peut s'aider de Google ou de livres d'administration Oracle pour le décrypter mais, curieusement, même les DBA les plus connus ne sont pas d'accord sur l'ordre dans lequel Oracle exécute les différentes opérations de ce plan! Pour rappel, il est fondamental de comprendre l'exécution de ce plan pour tuner un ordre SQL! Si on ne sait pas quelle est la première opération exécutée, il est impossible de mettre en... [Lire la suite]
Posté par David DBA à 21:33 - - Commentaires [0] - Permalien [#]
Tags : ,
31 mai 2017

SQL*Plus et les accents sous Windows

IntroductionVous est-il déjà arrivé avec SQL*Plus sous Windows d'avoir des accents remplacés par des caractères spéciaux? Et, si oui, après avoir cherché sous Google comment résoudre cela, vous êtes-vous dit que les solutions proposées à base de NLS étaient incompréhensibles? Si c'est le cas, lisez la suite car il se peut que ce ne soit pas un problème de NLS Oracle mais plutôt de code service Windows. Points d'attentionN/A. Base de testsN'importe quelle base Oracle mais avec SQL*Plus sous Windows.  ExemplesVoici ce que... [Lire la suite]
Posté par David DBA à 17:03 - - Commentaires [0] - Permalien [#]
Tags :
08 mai 2017

Un monitoring des index plus évolué que celui d'Oracle

IntroductionSi vous avez déjà utilisé l'outil de monitoring des index d'Oracle, vous avez dû être effarés devant la pauvreté de celui-ci. Oracle n'indique en effet que si Oui ou Non un index est utilisé durant la période de monitoring mais pas le nombre de fois qu'on l'utilise. Dans le cas où vous voulez supprimer des index d'une table qui en a trop parce qu'ils ralentissement les INSERT et DELETE, la première chose à faire est de voir si ces index sont utilisés ou non mais aussi combien de fois ils le sont avant de prendre une... [Lire la suite]
Posté par David DBA à 22:21 - - Commentaires [0] - Permalien [#]
Tags : , ,
02 mai 2017

Jointures SQL : syntaxe propriétaire Oracle VS syntaxe ANSI92 (celle là, je ne l'aime pas!)

IntroductionJ'avoue, je déteste la syntaxe des jointures SQL introduite par la norme ANSI92, dite aussi SQL-92 et lui préférer de loin la syntaxe propriétaire d'Oracle!Pour quelles raisons? On va vite voir ça mais, en résumé, cette syntaxe manque de rigueur car une même jointure peut s'écrire de X façons différentes et possède plusieurs clauses optionnelles alors que la syntaxe Oracle est bien plus stricte. Dit d'une autre façon, il est facile et rapide d'expliquer à quelqu'un comment fonctionne la syntaxe propriétaire d'Oracle mais... [Lire la suite]
Posté par David DBA à 19:10 - - Commentaires [0] - Permalien [#]
Tags : ,
23 avril 2017

Liste des colonnes mises à jour sur une table : trigger et prédicat UPDATING

IntroductionSi vous voulez obtenir la liste des colonnes mises à jour en SQL pour une table donnée, à des fins d'audit, vous faites comment? Vous essayez de récupérer les ordres SQL UPDATE et vous décomposez celui-ci pour récupérer les noms des colonnes? Attention, certains ordres seront plus difficiles à traiter que d'autres comme la gestion des sous requêtes, des hints qui ne doivent pas être pris en compte etc etc. Vous utilisez un trigger et utilisez les paramètres OLD et NEW? Vous utilisez le package DBMS_FGA?La solution que je... [Lire la suite]
Posté par David DBA à 18:28 - - Commentaires [0] - Permalien [#]
Tags : , ,

08 avril 2017

Un ordre DDL est entouré par deux commit implicites; le premier est conditionnel

IntroductionVous savez qu'avec une commande DDL un Commit implicite est effectué. OK, mais savez-vous qu'en réalité il peut y en avoir deux, un avant et un après? Non? Alors ce post est pour vous!La règle est la suivante : un Commit a lieu normalement après une commande DDL (si elle n'échoue pas) mais aussi avant cette commande si un ordre DML non validé/non annulé a eu lieu avant la commande DDL.En résumé :           commande DML de nom... [Lire la suite]
Posté par David DBA à 12:32 - - Commentaires [0] - Permalien [#]
Tags : , , ,
02 avril 2017

Changer l'ordre des colonnes d'une table avec l'attribut Invisible

     IntroductionChez un client, un responsable développement est venu me voir avec un problème bien particulier. Il avait une table de 300 colonnes et, quand il voulait récupérer le nom de ses clients, au lieu de simplement faire un SELECT nom FROM clients, il récupérait toutes les données de la table puis faisait un extract du fichier .txt créé en se basant sur la position des caractères. En clair, pour lire le nom, il récupérait les caractères 50 à 99 dans ce fichier. OK, c'était une application ancienne,... [Lire la suite]
Posté par David DBA à 09:56 - - Commentaires [0] - Permalien [#]
Tags : ,
22 mars 2017

Tout le dictionnaire de données Oracle n'est pas dans DICT

       IntroductionUne base de données Oracle 11gr2 à sa création comporte à peu près 9000 tables et vues système différentes. Celles-ci composent le dictionnaire de données qui est la propriété du user SYS. Il va de soi qu'en cas de problème, trouver la bonne vue dans ce labyrinthe sera extrêmement difficile! Prenons l'exemple d'un message d'erreur relatif à un trigger. Vous connaissez la vue DBA_TRIGGERS mais saviez-vous qu'il existe les vues DBA_INTERNAL_TRIGGERS, DBA_TRIGGER_ORDERING,... [Lire la suite]
Posté par David DBA à 22:33 - - Commentaires [0] - Permalien [#]
Tags : ,
19 mars 2017

Evolution taille table : Insert, Delete, Truncate, Drop, Shrink, Move

          IntroductionUne légende tenace dans le monde Oracle dit qu'une fois les données d'une table supprimées, l'espace occupé par ces lignes est définitivement perdu! Oui, ça a l'air idiot mais on trouve encore cette histoire sur pas mal de forums. La réalité est plus complexe : une fois que des blocs de données ont été alloués à une table, ces blocs restent alloués à la table, même si l'intégralité des données est supprimée par un DELETE! Néanmoins ces blocs seront réutilisables lors... [Lire la suite]
Posté par David DBA à 12:33 - - Commentaires [0] - Permalien [#]
Tags : , , , , , ,