Procédure de connexion à Oracle
Isolation des transactions dans Oracle
Dans cette partie, on veut étudier le comportement d'Oracle en cas
d'accès concurrents à la même ressource. Pour cela on va simuler
l'exécution concurrente de programmes à l'aide du petit ensemble
de lectures/écritures. Créer une table Clients et un compteur par les commandes
suivantes: CREATE TABLE C (
NB number(8) not null,
NOM varchar2(20),
PRENOM varchar2(20),
TYPE varchar2(10)
)
/ CREATE SEQUENCE COMPTEUR
INCREMENT BY 1
START WITH 1
NOCYCLE
/ Insérer dans la table des clients le contenu de la table B avec de
nouveau NB obtenus par le compteur. Ajouter
un attribut cave a la table C. Initialiser cet attribut pour tous les
clients en fonction de leur type (petit=50, moyen=100,
gros=500). Créer 3 fichiers, nommés stock.sql, livraison.sql et conso.sql
stock.sql PROMPT 'Recherche du stock de Cesar';
SELECT 'La réserve de Cesar est de : ' || cave || ' bouteilles'
FROM c WHERE nom='Cesar'; livraison.sql PROMPT 'Un achat de 120 bouteilles est effectué par Cesar'
UPDATE C SET cave = cave + 120 WHERE nom = 'Cesar';
PROMPT 'Nouveau stock de Cesar';
SELECT cave FROM C where nom = 'Cesar'; conso.sql PROMPT 'Cesar retire 10 bouteilles de son stock';
UPDATE C SET cave = cave - 10 WHERE nom = 'Cesar';
PROMPT 'Nouveau stock de Cesar';
SELECT cave FROM C where nom = 'Cesar'; Ouvrir deux fenêtres SQLPLUS. Chaque session est considérée par ORACLE
comme un utilisateur, et on a donc 2 utilisateurs, nommés 1 et 2,
en situation de concurrence. Dans tout ce qui suit, on note INSTRi
l'exécution de l'instruction INSTR par l'utilisateur i. Par
exemple LIVRAISON1 correspond à l'exécution du fichier livraison dans la
première fenêtre par la commande @livraison. On note de même ROLi et
COMi l'exécution des commandes rollback; et commit; dans la
fenêtre i.
ORACLE pratique une verrouillage à deux phases assez
particulier. L'objectif est d'essayer de comprendre quel est ce
type de verrouillage. Il faut savoir que par défaut, Oracle
travail en degré d'isolation 1 (READ COMMITTED). Exécuter les séquences d'instruction décrites
ci-dessous. Qu'observez-vous ? expliquez. Tester les exécutions précédentes en spécifiant le mode suivant après chaque commit : SET TRANSACTION ISOLATION LEVEL SERIALIZABLE. Comparer et expliquez comment Oracle verrouille les données. Si vous avez compris comment fonctionne le verrouillage Oracle, proposez une execution concurrente de deux transactions de votre choix qui soit non serialisable et acceptée par Oracle. Comment faire pour que Oracle ne laisse pas passer ce genre d'executions ? Augmenter la taille de la table Clients à l'aide du script suivant: BEGIN
FOR x in 1..50 LOOP
insert into C (nb, nom, prenom, type) select compteur.nextval, nomb, prenomb, type from b;
commit;
END LOOP;
END;
/ Calculer le nombre de blocs de données occupés par cette table et
le nombre de n-uplets par bloc. Les commandes suivantes vous donnent
des indications sur la position physique de chaque n-uplet de la table C: select DBMS_ROWID.ROWID_TO_RESTRICTED (rowid,0) from c
/
select DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) || '.' || DBMS_ROWID.ROWID_BLOCK_NUMBER(RowID) from c
/ Consulter la table USER_SEGMENTS de la méta-base pour connaitre la
taille en octets (attribut bytes) et le nombre de blocs
(attribut blocks) du volume de stockage (segment) reservé
pour cette table. Comparer la taille réservée pour la table a
celle réellement occupée par les n-uplets. Effectuer des suppressions de tuples de la table et vérifier
l'évolution de la taille réellement occupée par les n-uplets de
la table C et celle qui lui est réservée.
Créer une copie de la table C en spécifiant les critères
d'allocation d'espace pour ce segment. Utiliser la clause
STORAGE (voir doc en ligne). Vérifier et comparer, la
fragmentation de l'espace alloué aux tables. Le but est de voir le plan d'exécution choisi par le SGBD. La
prise en compte d'index peut améliorer le coût d'une exécution. Un
index est intéressant à partir du moment ou il est sélectif,
c.a.d. qu'une restriction du type att = val ne renvoie que très peu
d'attribut (e.g. 1%). De plus, il n'est utile que quand la relation
indexé est suffisamment volumineuse (> à quelques pages). Trouver un
scénario basé sur une sélection par index sur la plus grosse table
(qu'on grossira artificiellement si nécessaire). Ce scénario doit vous
permettre de montrer (1) l'intérêt de l'index pour un attribut très
sélectif, (2) l'handicap de l'index pour un attribut peu sélectif et
(3) le surcoût en mise à jour (ou insertions) de ces index. Jouer sur changement du mode d'optimisation d'oracle (voir doc en
ligne) par la commande Ou xxxx peut valoir : Générer, expliquer et comparer les plans d'exécutions obtenus. Remarque. En cas de besoin, vous pouvez désactiver un index ainsi :
pour un test att = valeur, si attribut est de type varchar,
faire attribut || ' ' = valeur (concaténation d'un espace). Si
c'est un nombre, attribut + 0 = valeur. Jointures Créer un jeu de requêtes joignant plusieurs tables et faisant des sélections à divers endroits.
Exécuter ces requêtes de différentes manières : par jointure 'plates',
par imbrication avec in, par imbrication avec exists. Regarder,
expliquer et comparer les plans d'exécutions générés. sqlplus LOGNAME/PASSWORD@nfres5/orcl11 où LOGNAME est votre compte oracle et vaut de
bda40 à bda70 selon votre station, PASSWORD vaut
bda pour tout le monde.
Partie I : Transactions et concurrence
COM1, COM2, stock1, stock2, conso1, stock2, ROL1, stock1, stock2.
COM1, COM2, stock1, stock2, conso1, stock2, COM1, stock1, stock2,
COM1,
COM2, stock1, stock2, conso1 , stock2, livraison2, stock1,COM1,
COM2.
Partie I : Organisation physique, Optimisation
alter session set optimizer_mode = xxxxxx
A1 : Connexion à Oracle
Exemple :
sqlplus bda35/bda@infres5/orcl11
save filename.sql/* sauve le contenu du buffer dans un fichier de nom filename.sql */ get filename.sql/* charge le buffer avec le contenu du fichier de nom filename.sql */ start filename/* charge le buffer et lance l'exécution du fichier script sql */ run/* lance l'exécution du contenu du buffer */ spool filename.txt/* copie la sortie écran sur le fichier filename.txt */ spool off/* suspend l'opération précédente */ help commande/* pour obtenir de l'aide sur la commande donnée en argument */
set pagesize 20 /* formate la sortie écran par blocs de 20 lignes */
set pause on /* ne visualise la sortie qu'après un 2e RC - bloc par bloc - */
set timing [on|off] /* active ou désactive le chronomètre */
set heading [on|off] /* active ou désactive l'affichage de l'entête de colonnes */
desc[ribe] tablename/* donne le schéma de la relation tablename */ all_catalog/* relation donnant toutes les tables accessibles */ user_catalog/* relation donnant les seules tables du USER */ cat/* synonyme de la précédente ..*/ all_objects/* relation donnant tous les objets accessibles */ user_objects/* relation donnant les seuls objets du USER */ obj/* synonyme de la précédente ..*/ user_sys_privs/* relation donnant les privilèges système du USER*/ user_tab_privs/* relation donnant les privilèges sur les objets accessiles*/
![]()