Oracle, mais ou sont mes données?

Voici le fruit d’une réflexion personnelle fort instructive. Pour certains, un SGBD permet de stocker des données et la manière n’est pas intéressante. Pour moi, tant que je ne comprends pas, j’ai l’impression de ne pas maîtriser.

Ainsi, je me propose de répondre à une question de base : ‘C’est quoi cette ligne?‘. Chaque ligne est identifiée par un ROWID, donnée unique pour l’ensemble de la base de données. On peut le lire ainsi:

select ROWIDTOCHAR(rowid), t.*
from table_perso t
where rownum < 100;

Le résultat est aussi moche qu’indigeste. Essayons plutôt de le faire décoder par le moteur:

select DBMS_ROWID.ROWID_OBJECT(rowid) « DB OBJECT »,
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) « DB FILE »,
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) « DB BLOCK »,
DBMS_ROWID.ROWID_ROW_NUMBER(rowid) « DB ROW »,
t.*
from table_perso t
where rownum < 100;

La c’est bien plus instructif, le résultat désigne la table et le fichier de stockage. On sait donc tout sur cette ligne: comment y accéder et ou elle se trouve. On peut rendre le résultat plus sympa encore; pour obtenir la table, on essaiera :

select *
from user_objects
where DATA_OBJECT_ID=
(
select DBMS_ROWID.ROWID_OBJECT(rowid) « DB OBJECT »
from table_perso t
where rownum = 1
);

On peut faire de même sur le fichier de données; on saura exactement où la ligne est stockée sur le serveur; incroyable, non? Pour ceci, voici la requête:

SELECT *
FROM DBA_DATA_FILES
where FILE_ID in
(
select DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) « DB FILE »
from table_perso t
where rownum = 1
);

Maintenant, on peut imaginer le travail du SGBD. Il transforme l’information contenue dans un gros fichier indigeste en table tout en conservant le lien direct vers chaque ligne d’information. Quand j’exécute une requête, je ne peux qu’admirer le travail du moteur…

Publicités

1 commentaire

Classé dans DATA

Une réponse à “Oracle, mais ou sont mes données?

  1. Si je continue dans ma logiqe,
    Je viens de localiser la table qui se cache derrière les vues user_source.
    On peut donc avoir accès au datafile stockant tous les package et procedures stockées.
    La suppression de ce fichier doit être un acte de vandalisme assez impactant 😉
    Testez la requête suivante:
    SELECT *
    FROM DBA_DATA_FILES
    where FILE_ID in
    (
    select DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)
    from sys.source$ t
    where rownum = 1
    );

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s