03 mai 2019

Changer le propriétaire d'une table en hackant le dictionnaire de donnés - Change the owner of a table by hacking Oracle

IntroductionOracle ne permet pas de changer le propriétaire d'un objet dans sa base de données : point! Pour quelles raisons? Peut-être que c'est trop complexe, qu'à cause des dépendances avec d'autres objets cela devient ingérable...     Mais si on est obligé de le faire, il existe des solutions de contournement.1) Datapump : export/import dans un nouveau schéma avec le paramètre REMAP_SCHEMA. Par exemple, on exporte le schéma hr et on le réimporte sur la même base dans le schéma scott.    ... [Lire la suite]
Posté par David DBA à 16:31 - - Permalien [#]
Tags : ,

22 avril 2019

Historique du nb de lignes d'une table : table AWR SYS.WRI$_OPTSTAT_TAB_HISTORY - History of the row number of a table

IntroductionPar défaut, il n'est pas possible sous Oracle de voir l'historique du nombre de lignes d'une table. Cela peut-être assez gênant si on veut expliquer pourquoi un SELECT prends dix fois plus de temps que le mois précédent; surtout si les développeurs et chefs de projet jurent, la main sur le coeur, que non, la taille de la table n'a pas changé et que donc le problème est forcément sur la base :-)Pour leur prouver que cette table a grossi, fortement même, il faut utiliser des moyens détournés, par exemple requêter une des... [Lire la suite]
Posté par David DBA à 12:33 - - Permalien [#]
Tags : , ,
14 avril 2019

Commit : Oracle l'exécute le plus rapidement possible - Commit: Oracle executes it as quickly as possible

IntroductionLire des données sur disque dur est infiniment plus lent que des lire en mémoire (à l'échelle informatique, j'entends). Par exemple, pour des disques durs à plateaux (non SSD donc) avec une vitesse de rotation de 15 000 tours minutes, une lecture de bloc demande au mieux 2 milli secondes. Pour une mémoire de type RAM, la même lecture se fera entre quelques dizaines ou centaines de nanosecondes, soit entre dix mille et cent mille fois moins que pour un disque dur. Oracle a donc tout intérêt à tenir en mémoire un maximum de... [Lire la suite]
Posté par David DBA à 18:05 - - Permalien [#]
Tags : ,
30 mars 2019

DBMS_STATS : toutes les fonctions classées par famille - DBMS_STATS: all features sorted by family

IntroductionLe package DBMS_STATS est l'un des plus importants sous Oracle. Il permet de générer les statistiques de la base, indispensables pour que l'optimiseur calcule de bons plans d'exécutions. Mais ce package est bien plus riche que la simple collecte des stats et c'est ce que nous allons voir dans cet article.Attention, l'objectif est de montrer les familles de fonctions de ce package, et non pas de tester chacune de ces fonctions avec chacun des paramètres. Les exemples seront donc basiques.La liste des fonctions du package... [Lire la suite]
Posté par David DBA à 11:37 - - Permalien [#]
Tags : ,
03 mars 2019

Utiliser SQL pour lire le fichier ALERT.log - Use SQL to read the ALERT.log file

IntroductionLe fichier dit ALERT.log est celui où un DBA doit aller en premier lorsqu'un problème sérieux survient sur une base. C'est ici que sont enregistrés les arrêts/relances de la base, la valeur des paramètres de l'instance qui ne sont pas ceux par défaut, toutes les opérations sur la base comme l'ajout d'un tablespace, la suppression d'un fichier de données, les erreurs internes Oracle de type ora-00600, les deadlocks et autres erreurs du SGBD; bref c'est le passage obligé en cas de coup dur!     Ce fichier... [Lire la suite]
Posté par David DBA à 19:07 - - Permalien [#]
Tags : ,
12 février 2019

Les tables IOT : partie 2, index secondaire décalé avec l'index primaire - Secondary index shifted with primary index

  IntroductionCet article présentait les concepts de base d'une table IOT : http://dbaoraclesql.canalblog.com/archives/2019/01/29/37058939.html.Nous allons maintenant voir s'il est possible de prouver, comme le dit la doc Oracle, que lorsque les logicals rowid de l'index secondaire ne sont plus en phase avec les vrais rowids de la table IOT, alors Oracle fait une lecture directe via le rowid qui échoue avant de parcourir la table IOT.   Points d'attentionAucun. Base de testsUne base Oracle 12. ... [Lire la suite]
Posté par David DBA à 13:14 - - Permalien [#]
Tags : ,

29 janvier 2019

Les tables IOT (Index Organized Table) : partie 1, généralités - IOT (Index Organized Table) tables: part 1, general

  IntroductionUne table IOT (Index Organized Table) est une table d'un genre spécial. A la différence d'une table classique, dite aussi HOT (Heap Organized Table), cette table possède de multiples particularités qu'il est bon de connaître pour ne pas être vite débordé par leur complexité.En premier, une table classique, avec un index pour la PK, est en réalité un ensemble de deux objets : la table ET l'index, comme un livre avec son index à la fin. En revanche une table IOT ne comprend en réalité qu'un index et pas de table;... [Lire la suite]
Posté par David DBA à 13:00 - - Permalien [#]
Tags : ,
05 janvier 2019

Autotrace : liste des statistiques différentes selon qu'on utilise SQL*Plus, SQLcl, Toad ou SQL Developer

  IntroductionLa commande AUTOTRACE permet d'afficher, pour un ordre SQL, un plan d'exécution mais aussi des statistiques relatives à cet ordre. Là où la situation se complique, c'est qu'Oracle, et les éditeurs tiers, proposent des stats différentes selon les outils utilisés; c'est ce que nous allons voir.  Points d'attentionAucun. Base de testsUne base Oracle 12 avec au moins sqlcl installé. Exemples============================================================================================Stats Autotrace avec... [Lire la suite]
Posté par David DBA à 13:55 - - Permalien [#]
Tags : , ,
20 décembre 2018

Index virtuel et index invisible : à quoi servent-ils? - Virtual index and invisible index: what are they for?

IntroductionLa création d'un index, ainsi que sa suppression, peuvent prendre des heures selon la volumétrie des tables. En 2018, une table de 500 millions d'enregistrements n'a rien d'extraordinaire, ni même une table en ayant 5 milliards. Le problème est que lorsqu'on veut optimiser une requête via l'ajout d'un index pour voir si le CBO génère un meilleur plan, tester cette hypothèse va prendre trop de temps. C'est pour répondre à ce problème que Oracle a créé les types d'index suivants : index virtuel et index invisible. Ces types... [Lire la suite]
Posté par David DBA à 18:21 - - Permalien [#]
Tags : ,
16 décembre 2018

Index partiel sur NULL : comment indexer uniquement la valeur NULL d'une colonne - Partial index on NULL: how to index only NULL

IntroductionOn vous a dit qu'il n'était pas possible sous Oracle d'indexer la valeur NULL. J'ai prouvé ici que c'était faux : http://dbaoraclesql.canalblog.com/archives/2018/08/05/36611094.html. Idem pour le fait que Oracle ne gère pas d'index partiel : cette fonctionnalité est disponible en 12c mais uniquement pour des tables partitionnées.  Néanmoins il existe une solution de contournement depuis plusieurs  versions d'Oracle : créer un index sur fonction qui mettra à NULL les valeurs que l'on ne veut pas indexer, et, de la... [Lire la suite]
Posté par David DBA à 10:35 - - Permalien [#]
Tags : ,