Archives mensuelles : juillet 2015

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…

1 commentaire

Classé dans DATA