Cours 05
Cours 05
Cours 05
Ce document peut être utilisé à des fins personnelles sans aucune restriction. Pour toute
autre utilisation, contacter l’auteur en vue d’une autorisation préalable
P. Buche INA-PG UER-Informatique Bases de données 07/10/2005 page 1
1. Introduction
objectifs différents.
Schémas
externes
1. Modélisation
5. Vues
2. Traduction
Schéma Schéma
conceptuel logique
3. Implantation
Schéma
physique
4. Stockage
BD SGBD
Architecture ANSI - SPARC 1975
• relationnels,
• objet-relationnels,
• objets,
• XML.
• Persistance
• Gestion du disque
• Indépendance logique/physique
• Index, hash-coding
• Cache mémoire
• la base de données
• le schéma
• les index
Tous les utilisateurs ne peuvent pas tout faire sur toutes les données.
• simples,
• déclaratives,
Depuis le début des années 90, les réseaux LAN (Local Area Network) et
WAN (Wide Area Network) sont devenus l’épine dorsale du système
informatique des entreprises en s’appuyant sur la technologie Internet.
Depuis le milieu des années 90, cette technologie est mise à la disposition
du grand public (WEB).
Client
Serveur
Procédures applicatives
Serveur SGBD
OS2, Unix, Windows NT Données
Requête Résultat
Application
Client
Outil de développement
Outil de connectabilité
Protocole réseau
Réseau
Requêtes Résultats
Protocole réseau
Serveur
Outil de connectabilité Base de
données
Serveur BD
Outils de développement :
• En cas de mise à jour, il faut déployer la mise à jour sur tous les
clients
Client
SGBD
RESEAU
Serveur
SGBD SGBD SGBD SGBD SGBD
Internet et Java sont les solutions largement utilisées pour réduire ces
coûts .
Navigateur
Traitement Serveur
d’applications
données
Base de
Base de données
données
P. Buche INA-PG UER-Informatique Bases de données 07/10/2005 page 17
On peut distinguer deux types de client-serveur sur Internet :
Avantages :
Inconvénients :
Avantages :
Inconvénients :
Le modèle relationnel
• Le langage PL/SQL
• L’interface C/SQL
Fonctionnement du SGBD
• Gestion des accès concurrents
• Architecture du SGBD
2.1.1 Propriétés
▲ ayant un sens,
Les propriétés servent à décrire les entités et les associations. Ce sont donc
des particules d’information. On les appelle également attributs ou
colonnes (dans le modèle relationnel).
Propriété Occurrences
NomAssuré Dupont
Dupond
Martin
AnnéeSouscription 1988
1989
AgeAssuré 32 58
Exemple : NumContrat
Une association peut être réflexive, c’est-à-dire qu’elle relie une entité à
elle-même.
Personne Est_Marié_A
Exemples :
1,1 1,n
Contrat Etablir Client
0,n 0,n
Client Commande Produit
Cette fois-ci, l’héritage est exclusif (symbolisé par une croix) : les
intervenants sont considérés en tant que personnes morales et les
autres (souscripteurs et assurés) sont considérés en tant que personnes
physiques.
• ...
titre de l'ouvrage
commune de l'adhérent
date de l'emprunt.
LIVRE OUVRAGE
No Livre No ISBN
Etat Livre Titre ouvrage
Nb Pages
LIVRE OUVRAGE
No Livre 1,1 est un exem-
1,n No ISBN
Etat Livre plaire Titre ouvrage
Nb Pages
0,1
1,n 0,n
Notations :
Observations :
* Il y a trois tarifs par modèle :
un tarif au km, un forfait week-end, un forfait semaine
Désignation : Clients
Observations : rien
Document 3
Désignation : Véhicules
Désignation : Contrats
Observations :
Pour un même client, le nombre maximum de contrats rencontrés
est de 10.
Désignation : Planning
Classement : Marque
Modèle (Ligne)
Numéro minéralogique
Jour (Colonne)
Marque X (10)
Modèle X (13)
Numéro minéralogique X (8)
Date de début du contrat 9 (6)
Date de fin du contrat 9 (6)
Numéro du contrat 9 (5)
Date du début de révision 9 (6)
Date de fin de révision 9 (6)
Observations :
Sur le planning, un véhicule est lié en général à 3 contrats.
Classement : Modèle
Numéro minéralogique
Observations :
* Actuellement, il y a au maximum 30 révisions pour un véhicule.
2.9.1 Objectif du TD :
Abonné
Livre NoAbonné
NoLivre Prêt Nom
Titre Prénom
0,n DatePrêt 0,n
DateAcquisition DateCotisation
DateRetour
NbPrêts NbAmendes
Abonné : 2
Livre : 2 NoAbonné
Prêt en cours
NoLivre Nom
Titre 0,1 DatePrêt 0,n Prénom
DateAcquisition DateRetour DateCotisation
NbPrêts NbAmendes
0,n 0,n
AEtéPrêté AEmprunté
1,1
0,n 0,n
0,n
Produit Produit2 Produit3
NoProduit NoProduit NoProduit
Exemples :
• booléen = {0, 1}
rouge 0
rouge 1
vert 0
vert 1
bleu 0
bleu 1
A1 A2
rouge 0
vert 1
bleu 0
bleu 1
• Données redondantes
• Risques d'incohérence
Il faut tolérer les valeurs nulles si on veut représenter des voitures sans
propriétaire ou des personnes sans véhicule
Nom Prénom
Martin Jacques
Martin Jacques
Dupont Pierre
Fantas Yves
Exemple :
R S
Marque Couleur Couleur Puissance
Renault Rouge Rouge 6
Peugeot Rouge Verte 5
Peugeot Verte Rouge 4
R S
R = jointure de R1 , R2 , ..., Rn
NV COULEUR
TYPE MARQUE
TYPE PUISSANCE
Augmentation : X Y => XZ YZ
Transitivité : X Y et Y Z => X Z
On en déduit :
Union : X Y et X Z => X YZ
Pseudo-transitivité : X Y et WY Z => XW Z
2) Exhaustivité : (Min(F))+ = F+
Exemple :
Min(F) = F
1) X A1 , A2 , ..., An
NV COULEUR
TYPE MARQUE
TYPE PUISSANCE
NV TYPE
NV vérifie 1) et 2)
1) Elle est en 1 FN
nom adresse
Fournisseur(nom, adresse)
1) Elle est en 2 FN
2) Tout attribut non clé ne dépend pas d'un attribut non clé
NV TYPE PUISSANCE
NV TYPE MARQUE
Entrées de l'algorithme :
Les sorties :
Les étapes :
• Liste des DF :
1) NV MARQUE
2) NV COULEUR
3) NV PUISSANCE
4) TYPE MARQUE
5) TYPE PUISSANCE
6) NV TYPE
7) NSS NOM
8) NSS PRENOM
9) NSS, NV DATE
F = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Itération 2 : I2 = {MARQUE} U I1
Itération 2 : I2 = {MARQUE} U I1
2) NV COULEUR
4) TYPE MARQUE
5) TYPE PUISSANCE
6) NV TYPE
7) NSS NOM
8) NSS PRENOM
9) NSS, NV DATE
F1 = {2, 6}
F2 = {4, 5}
F3 = {7, 8}
F4 = {9, 10'}
1) Elle est en 3 FN
2) Tout attribut non clé ne doit pas déterminer une partie de la clé
Exemple : la vente de types de produits par des réseaux de distribution.
Règle 1 : Un type de produit, pour une année donnée est distribué par
un seul réseau
RESEAU → TYPEPROD
Avec cette modélisation en 3FN, on peut très bien ajouter dans la première
table un tuple (TP1, 1993, R26). Cette information est incohérente avec le
contenu de la deuxième table.
Si l’on veut ajouter le tuple (R41, TP3, 1997), alors pour respecter la DM,
il faut également ajouter le tuple (R41, TP3, 1998).
Remarque : il existe une 5ème forme normale basée sur les dépendances de
jointure (cf Morejon 1995 et Ullman 1988 pour une définition de cette
forme).
Employé Département
NoEmployé ., 1 ., n NoDépt
Affecté
... date affectation ...
Département(NoDept, ...)
Client Produit
NoClient ., n ., n NoProduit
Commande
... Q ...
Client(NoClient, ...)
Produit(NoProduit, ...)
Commande(NoClient, NoProduit, Q)
0, n
Responsable
no_emp
1,1 ou 1,n
...
a pour chef
LIVRE OUVRAGE
No Livre 1,1 est un exem-
1,n No ISBN
Etat Livre plaire Titre ouvrage
Nb Pages
0,1
1,n 0,n
Emprunter Ecrit
date_retour Qualifie
1,n 0,n
0,n
Livre(no-livre, état-livre)
Motclé (motclé)
Par R4 :
Livre(no-livre, état-livre)
Livre(no-livre, état-livre, no-isbn, no-adh, date-retour)
Par R5 :
Ecrit(no-isbn, no-auteur)
Qualifie(no-isbn, mot-clé)
Contrat
Client no_contrat
no_client date_fin
code_postal date_fin_prev
Etablir 1,1
nom_client date_début
adr_client 0,n date_début_prev
1,1 date_établissement
1,1
Affecter
Choisir_tarif
0,n
Véhicule
no_minéralogique
couleur
0,n
km_en_cours
1,1
TypeLocation
0,n code_tarif
lib_tarif
Réviser 0,n
est_une
date_fin_rev
date_début_rev
coût_révision Tarifer
kilométrage tarif_location
0,n 0,3
0,n
Modèle
TypeRévision
modèle
code_révision
marque
lib_révision
puissance
caution
1,1
1,n
Train Affecter loco Train
Affecter wagons
1,1 NoTrain
NoTrain 1,1
...
Locomotive
Locomotive Wagon
liste de
Wagons NoLocomotive
NoWagon
...
...
3.6.1 Objectif du TD
3.7.1 Introduction
Les langages relationnels (SQL, QBE, ...) sont assertionnels (ie permettent
de définir les données que l'on souhaite sans dire comment y accéder).
• les relations :
Fournisseur
Produit
f p qté
f1 p1 1
f1 p4 1
f1 p6 2
f2 p2 1
f3 p2 5
f4 p6 3
f4 p5 7
f1 p5 8
f4 p4 2
f3 p4 1
f2 p4 1
f5 p3 10
3.7.3.1 La projection
f
f1
f2
f3
f4
f5
3.7.3.4 La sélection
Exemple : la relation P
p nom-p
p4 moutarde
p5 salade
p6 cornichon
Résultat f
f1
f4
mafourniture [f]
Q4 - Q3
Q3 - Q4
On renomme mafourniture en M1 et M2
• le produit cartésien
• la différence ensembliste
• l'union ensembliste
• la sélection
• la projection
• l'intersection : R ∩ S = R - (R - S)
R X A S B
x1 a1 a1
x1 a2 a2
x2 a1
x3 a1
x3 a2
x3 a3
x4 a3
X A
x1 a1
x1 a2
x2 a1
x2 a2
x3 a1
x3 a2
x4 a1
x4 a2
Insertion
Destruction
Mise à jour
mafourniture : = (mafourniture - < f2, p2, 1 >) ∪ < f2, p2, 4 >
Exemple :
La table Amateur
buveur bière
Dupont Tuborg
Martin Valstar
Meteyer Tuborg
Meteyer Kronenbourg
Meteyer Valstar
Q1 : Trouver les noms de bars qui servent au moins une bière que
Dupont aime.
Q2 : Trouver les buveurs qui fréquentent au moins un bar qui sert une
bière qu'ils aiment.
Q3 : Trouver les buveurs qui ne fréquentent pas de bar qui sert une
bière qu'ils aiment.
Q5 : Trouver les bars qui servent au moins toutes les bières que
Dupont aime.
SQL est un langage non procédural. On exprime ce que l’on veut obtenir et
non pas comment on veut l’obtenir.
Exemple : SPEINFO1.FILM.TITRE
exemple : '01-JAN-94'
4.3.4 BLOBs
Exemples
Limitations :
Exemple
• user_constraint
• user_cons_columns
Quelles sont les contraintes définies sur la table Livre (exemple ci-dessus) :
from user_constraints
where table_name=’LIVRE’ ;
P : clé primaire
U : clé unique
R : intégrité référentielle
select column_name
from user_cons_columns
where
table_name=’LIVRE’
and
constraint_name=’ C_LIVRE_PRIX’;
Exemple :
Attention : Il ne faut pas créer d’index sur les colonnes dans lesquelles on
a une distribution de valeurs faible (le sexe par exemple).
Suppression directe
Le propriétaire d'une table ou d'une vue est celui qui l'a créée. Par défaut,
lui seul peut l'utiliser. Il peut aussi en accorder l'accès sélectivement à
d'autres utilisateurs ou à tout le monde (PUBLIC).
Remarque : On ne peut pas retirer un droit que l’on n’a pas donné
directement.
Pour être surs de pouvoir utiliser Oracle depuis votre compte Unix, vérifiez
les variables d’environnement suivantes :
ORACLE_BASE=/usr/local/oracle
ORACLE_HOME=/usr/local/oracle/product/10.1.0/Db_1
ORACLE_SID=speinfo
NLS_LANG=AMERICAN_AMERICA.WE8DEC
env
Créez une base relationnelle sous Oracle qui permette de gérer un stage de
danse d’une semaine en résidence.
1 Rey
2 Gilles
3 Denis
4 Amandine
Table 1 Intervenant
1 Rogelio 35
2 Iskander 32
3 Susana 43
4 Ada 20
Table 2 Participant
Salsa1 4 4 Salsa1
Salsa2 1 1 Salsa2
Lindy1 5 4 Lindy1
Lindy2 3 3 Lindy1
Tango1 4 4 Tango1
Tango2 2 2 Tango2
Table 3 Atelier Table 4 Est_Inscrit_En
Ecrivez dans un fichier stage.sql, sous un éditeur de texte, les requêtes SQL
de création de ce schéma relationnel en tenant compte des contraintes
suivantes :
Exécutez les requêtes de création sous sqlplus. Insérez dans les tables
créées les valeurs indiquées dans les tables ci-dessus. Pour exécuter les
requêtes lancez l'interpréteur SQL d'Oracle en vous connectant au compte
Oracle qui vous a été attribué (noté speinfoI ci-dessous). La commande à
exécuter est la suivante :
sqlplus speinfoI (I variant de 1 à 8 selon le compte)
Remarque : Vous pouvez vérifier que vos tables sont bien créées en
utilisant une vue sur le dictionnaire de données :
SQL> select table_name from user_tables;
Vérifiez que leur structure est conforme à ce que vous avez spécifié.
L'instruction suivante donne la structure de la table ATELIER :
SQL> desc ATELIER
(i) utiliser des ordres SQL d’insertion que vous exécuterez sous
l’interpréteur Oracle présenté ci-dessus.
(ii) attacher vos tables Oracle sous Access et saisir les valeurs dans les
tables à partir de l’interface graphique d’Access. L’attachement
des tables se fait sous Access à partir du menu Fichier, Données
externes, fichier ODBC. Il faut avoir préalablement créer un DSN
(Data Source Name) avec l’administrateur ODBC de Windows
référençant la base de données Oracle tournant sur la machine
Unix.
4.9.1 Objectif du TD
On se propose de créer une base de données sous Oracle à partir d’un script
SQL généré par l’outil de conception AMC Designor. Puis, on fige la
version de la base de données créée sous forme de modèle archivé sous
AMC. On effectue ensuite une mise à jour du schéma sous AMC. Cette
mise à jour est ensuite répercutée sur la base Oracle. Enfin, on réalise une
opération de reverse engineering pour reconstituer un MCD (Modèle
Conceptuel de Données) à partir du schéma enregistré sous Oracle.
• Suppression de tables
• Création de tables
• Autres index
• Utiliser le Code
Suffixez le nom du fichier texte qui contiendra le script SQL par sql
(exemple : voiture.sql).
Regardez le fichier de trace sous emacs pour vérifier qu'il n'y a pas d'erreur
injustifiée dans la trace de chargement du schéma. Si vous en trouvez,
corrigez le script SQL sous emacs et relancez le chargement du schéma
jusqu'à ce qu’il n’y ait plus d’erreur au chargement.
Sous AMC Designor, fermez tous les modèles ouverts. Dans le menu
Fichier, Modèle physique, sélectionnez l’option Reverse Engineering.
Lorsque toutes les tables sont importées sous AMC, sélectionnez l’option
Générer Modèle Conceptuel du menu Dictionnaire. Analysez le MCD
reconstitué.
select nom_table.nom_colonne*
from nom_table*
[where conditions_de_sélection_sur_lignes*]
[group by nom_colonne_de_regroupement*]
[having conditions_de_sélection_sur_groupe*]
[order by nom_colonne_tri*]
L’ordre SQL Select n’élimine pas les doubles, à moins que ce ne soit
explicitement demandé par le mot-clé DISTINCT.
Une sélection est une restriction suivie d’une projection. Une restriction est
une combinaison booléenne (or, and, not) de conditions élémentaires
portant sur les colonnes d’une table. Les prédicats de restriction permettent
la comparaison d’une valeur portée par une colonne à une valeur constante.
Ils peuvent s’exprimer de différentes manières :
• à l’aide des opérateurs =, <>, <, >, <=, >= (cf Q1, Q2)
On recherche le nom des auteurs nés entre 1802 et 1850 (ainsi que
leur lieu de naissance).
Exemple support :
Le résultat d’une sous-question peut être soit une valeur simple, soit un
ensemble de valeurs.
Exemples :
On peut tester si le résultat d’une sous-question est vide ou non. Pour cela,
on utilise le quantificateur EXISTS. EXISTS <sous-question> est vrai si le
résultat de la sous-question est non vide.
Exemple :
On peut stocker des informations hiérarchisées dans une table. SQL permet
de faire l’exploration d’un sous-arbre.
1 Balzac Roman 1
2 Dumas Roman 1
3 Dumas Théâtre 1
4 Hugo Poésie 2
5 Hugo Roman 1
On peut appliquer des fonctions sur les colonnes résultats d’un select. On
dispose de fonctions pour :
ROUND(123.27, 1) → 123.3
ROUND(123.22, 1) → 123.2
ROUND(101.8) → 102
TRUNC(123.33) → 123
TRUNC(123.567, 2) → 123.56
FLOOR(129.1) → 129
CEIL(129.1) → 130
SUBSTR(NOM, 1, 15)
SUBSTR(NOM, LENGTH(NOM)-2, 3)
• REPLACE permet de remplacer une chaîne par une autre chaîne dans
une colonne
UPDATE ECRIVAIN
SET NOM=REPLACE(NOM, ’DUPONT’, ’DUPOND’) ;
UPDATE ECRIVAIN
SET NOM=LTRIM(RTRIM(NOM));
UPDATE ECRIVAIN
SET NOM=LTRIM(NOM, ’1234567890’) ;
LPAD(NOM, 20)
SELECT NO_JOUR,
DECODE(NO_JOUR, 1, ’LUNDI’, 2, ’MARDI’, 3, ’MERCREDI’,
4, ’JEUDI’, 5, ’VENDREDI’, 6, ’SAMEDI’, 7, ’DIMANCHE’)
FROM MA_TABLE ;
→ 6 SAMEDI
Elément Signification
D jour de la semaine (1-7)
MI minute (0-59)
MM mois (1-12)
SS seconde (0-59)
SELECT
SUM(1000* TO_NUMBER(ANNEE_FIN) - TO_NUMBER(ANNEE_DEB))
FROM EMPLOYE_RECOMPENSE ;
Exemples :
WHERE AUTEUR IN
(SELECT AUTEUR
FROM ECRIVAIN
WHERE LIEU = ‘PARIS’);
Une transaction est une unité logique de traitement des données vis à vis
des accès multiples et des pannes éventuelles (logicielles ou matérielles).
Exemple :
savepoint val1
...
rollback to val1
Remarque : Tous les ordres SQL du DDL (create, drop, alter, ...) génèrent
un COMMIT automatique.
• Projection
• Jointure naturelle
• θ-jointure
• Sélection
• Division : Sur l'exemple de la base aérienne, quels sont les pilotes qui
conduisent tous les AIRBUS ?
AVION (#AV_N°, …)
PILOTE (#PLN°, …)
VOL (#VOLN°, AVN°, PLN°)
• Intersection :
SELECT A.AUTEUR
FROM LIVRE1 A
WHERE EXISTS
(SELECT B.AUTEUR
FROM LIVRE2 B
WHERE A.AUTEUR = B.AUTEUR);
On liste les auteurs qui ont écrit un livre avant 1850 et un livre après
1850.
SELECT AUTEUR
FROM LIVRE
WHERE ANNEE < 1850
INTERSECT
SELECT AUTEUR
FROM LIVRE
WHERE ANNEE > 1850 ;
• Différence ensembliste :
SELECT A.AUTEUR
FROM LIVRE1 A
WHERE NOT EXISTS
(SELECT B.AUTEUR
FROM LIVRE2 B
WHERE A.AUTEUR = B.AUTEUR);
On liste les auteurs qui ont écrit un livre avant 1850 et qui n'en ont pas
écrit après.
SELECT AUTEUR
FROM LIVRE
WHERE ANNEE < 1850
MINUS
SELECT AUTEUR
FROM LIVRE
WHERE ANNEE > 1850 ;
Les vues sont des tables virtuelles qui permettent de définir des filtres sur
des tables réelles. Elles se manipulent comme des tables.
SELECT *
FROM LOCLIVRE
WHERE TITRE = 'LES CHOUANS';
SELECT RAYON
FROM LOCLIVRE
WHERE AUTEUR = 'VEILLON'
AND TITRE=’Smalltalk V’) ;
SQL2 est complet par rapport à l'algèbre relationnel par émulation des
opérateurs
4.19.1 Objectif du TD
/home/test/td_oracle/td5
VEDETTE
ROLE
TITRE
NOM
PRENOM
MONTANTCACHET
Dans un premier temps, vous allez créer les trois tables sous votre compte
Oracle en exécutant le fichier SQL crebas.sql :
Puis, vous allez insérer des tuples dans ces trois tables avec l'utilitaire
sqlload d'Oracle.
Vérifiez que vous avez bien recopié les six fichiers nécessaires au
chargement des tables, à savoir :
acteur.dat et acteur.sod
film.dat et film.sod
vedette.dat et vedette.sod
P. Buche INA-PG UER-Informatique Bases de données 07/10/2005 page 163
Le lancement du chargement d'une table se fait sous l'interpréteur Shell
pour le compte Oracle speinfoXX (XX correspondant au numéro de compte
qui vous a été attribué) par la commande suivante qui se trouve dans le
fichier lance_sqlload :
Vous chargerez dans l'ordre : acteur, film puis vedette (puisque vedette
requière l'existence d'acteurs et de films). Consultez les fichiers acteur.txt,
film.txt et vedette.txt. Ils contiennent un rapport d’exécution du chargement
des trois tables. Lorsque les trois tables sont chargées, passez sous
l'interpréteur SQL.
Vous allez dans cette partie écrire des requêtes SQL que vous allez
exécuter pour interroger la base. Dans cette partie, et la suivante, vous avez
le choix de travailler (édition des requêtes et soumission à Oracle) sur le
serveur de la base de données ou sur un client Windows.
Q13 : Editer le nom des vedettes qui ont joué uniquement dans les
films du réalisateur VEBER.
Q14 : Editer le nom des réalisateurs qui ont fait au moins deux films.
Q15 : Editer le nom des réalisateurs qui ont fait au moins trois films.
Q16 : Editer le nom des vedettes qui ont joué dans tous les films du
réalisateur OURY.
Utilisez les instructions update, insert et delete pour mettre à jour la base.
Procédez de la même manière que pour les interrogations.
Q19 : Dans ce film, ajouter deux rôles joués par des vedettes : le
chômeur par P. Richard, l'ancien gangster par Depardieu
4.20.1 Objectif du TD
Vous allez dans cette partie reprendre les requêtes SQL que vous avez
écrites pour la base Oracle. Vous les adapterez si nécessaire pour pouvoir
les exécuter dans la base Postgresql.
Un premier exemple :
declare
nb_nombres constant int := 10;
nombre int := 100;
i int := 1;
begin
dbms_output.enable;
/* création d’une suite de 10 éléments */
for i in 1..nb_nombres loop
insert into suite values (nombre);
nombre := nombre + 10;
end loop;
dbms_output.put_line('La suite est créée');
end;
/
P. Buche INA-PG UER-Informatique Bases de données 07/10/2005 page 169
5.2 Déclaration des variables
declare
nom_emp_courant employe.nom_emp%TYPE ;
begin
select nom_emp
into nom_emp_courant
from employe
where no_emp = 100 ;
end ;
declare
emp_courant employe%ROWTYPE ;
emp_nouveau employe%ROWTYPE ;
...
begin
emp_courant.nom_emp := ‘Dupont’ ;
...
select *
into emp_courant
from employe
where no_emp = 100 ;
emp_nouveau := emp_courant ;
dbms_output.put_line(‘Nom : ‘ || emp_nouveau.nom_emp) ;
end ;
L’instruction IF :
end if ;
L’instruction LOOP
declare
i int := 1 ;
max_i int constant := 100 ;
begin
loop
i := i + 1 ;
exit when i > max_i ;
end loop ;
end ;
end loop ;
L’instruction GOTO :
endif ;
montant := taux*nb_commandes ;
...
<<trait_particulier>>
...
L’instruction NULL :
exception
when VALUE_ERROR then
dbms_output.put_line(‘Débordement de capacité dans
une affectation’) ;
when OTHERS then
NULL ;
declare
arg1 number ;
arg2 number ;
arg3 number ;
end ;
/
declare
n integer := 10 ;
function Factorielle(i in integer)
return integer is
begin
if i = 0 then return 1 ;
elsif i = 1 then return 1 ;
else return i*Factorielle(i-1) ;
end if ;
end ; /* Factorielle */
begin
dbms_output.enable;
dbms_output.put_line(to_char(Factorielle(n))) ;
end ;
/
Pour donner aux procédures un caractère permanent, il faut les stocker dans
la base de données.
end ; /* proc */
return integer is
begin
if i = 0 then return 1 ;
elsif i = 1 then return 1 ;
else return i*Factorielle(i-1) ;
end if ;
end ; /* Factorielle */
• user_objects
• user_source
select object_name
from user_objects
from user_source
where name=’FACTORIELLE’
order by line ;
SQL est un langage extensible. Toute fonction stockée est accessible dans
une requête SQL.
Exemple :
declare
/* déclaration des types */
type Tab_Rayon_Type is table of cercle.rayon%TYPE
index by binary_integer;
type Tab_Car_Type is table of varchar2(3)
index by binary_integer;
i binary_integer := 0;
nb_tuples binary_integer := 0;
somme number := 0;
cercle_rec cercle%rowtype;
nb_tuples := i;
dbms_output.put_line(to_char(somme));
dbms_output.put_line(tab_car(1));
end;
Exemple :
declare
type Rec_Cercle_Type is record
(id_cercle cercle.id_cercle%TYPE,
rayon cercle.rayon%TYPE,
info varchar2(3));
rec_rayon Rec_Cercle_Type;
begin
dbms_output.enable;
for cercle_rec in (select id_cercle, rayon from cercle)
loop
rec_rayon.rayon := cercle_rec.rayon;
rec_rayon.id_cercle := cercle_rec.id_cercle;
rec_rayon.info := cercle_rec.id_cercle;
rec_rayon.rayon := rec_rayon.rayon + 1;
update cercle
set rayon = rec_rayon.rayon
where id_cercle = rec_rayon.id_cercle;
end loop;
dbms_output.put_line('Fin maj');
end;
• un package d’implémentation
nombre_cache number := 1;
end P_Cercle;
begin
dbms_output.enable;
dbms_output.put_line(to_char(p_cercle.perimetre(10)));
dbms_output.put_line(to_char(p_cercle.nombre_visible));
end;
Vente
Trigger1 : maj stock dans
la table Produit
‘v01’,‘p01’, 60
Trigger2 : insertion
d’une ligne de
Produit commande si qté en
stock < 50
‘p01’, 100
40
Commande
1, ‘p01’, 100
begin
update produit
set qte_stock = qte_stock - :new.qte_vendue
where ref_produit = :new.ref_produit;
end;
/
Il existe deux types de triggers : trigger ligne (option for each row) et
trigger instruction (option par défaut)
Définitions : Un trigger instruction est exécuté une seule fois quelque soit
le nombre de lignes modifiées. Un trigger ligne est exécuté pour chaque
ligne modifiée.
begin
if :new.qte_stock < 50 then
insert into commande values
(seq_id_commande.nextval, :new.ref_produit, 100);
end if;
end;
/
2) Ecrivez un trigger qui stocke dans une table de statistiques les accès à la
table Acteur en insertion, suppression, modification. La structure de la table
de statistiques est :
• nom_table = ‘acteur’
Les fonctions seront regroupées dans un package. Leurs signatures sont les
suivantes :
function Point_dans_Poly (
coordx in Point.x%TYPE, coordy in Point.y%TYPE)
return smallint ;
Point(#id_point, x, y)
Delimite(#id_parcelle, #id_segment)
declare
resultat smallint:=0;
begin
dbms_output.enable;
p_sig.rectangle(3);
resultat := p_sig.point_dans_poly(25,10);
if resultat = 0 then
dbms_output.put_line('le point n''est inclus dans
aucun polygone');
else
dbms_output.put_line('le point est inclus dans le
polygone '|| resultat );
end if;
end;
Paul
X
20 U
Y
V W
25
Optimisation algorithmique :
On ne fait le test de l’intersection que si le point (x, y) se situe à l’intérieur
du rectangle englobant le polygone considéré. Puis, on considère la demi-
droite horizontale partant du point vers la droite. De cette manière, le test
de l’intersection entre la demi-droite et un segment du polygone revient à
comparer l’ordonnée du point aux ordonnées des extrémités du segment. Si
l’ordonnée du point est comprise entre les deux ordonnées des extrémités
du segment, il reste à vérifier que l’origine de la demi-droite se trouve à
gauche du segment pour qu’il y ait intersection.
6.1 Objectif
Les variables hôtes doivent être déclarées dans une DECLARE SECTION au
début du programme et doivent être précédées par le caractère : dans les
requêtes SQL.
void Connection()
{/* on renseigne les deux champs de la structure VARCHAR
*/
strcpy(username.arr, "speinfo");
username.len = strlen(username.arr);
strcpy(password.arr, "speinfo");
password.len = strlen(password.arr);
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL CONNECT :username IDENTIFIED BY :password;
printf("Connexion a Oracle sous le compte : %s \n",
username.arr);
return;
sqlerror:
printf("\nMessage d'erreur : \n% .70s \n",
sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}/* Connection */
Pour effectuer des contrôles sur le bon déroulement des requêtes, on utilise
l'instruction WHENEVER.
#include <stdio.h>
#include <ctype.h>
/* prog4 illustre la connection a Oracle et la
manipulation d'une table en insertion, modification,
suppression et recherche */
EXEC SQL BEGIN DECLARE SECTION;
char nom[21];
char prenom[21];
char sexe[2];
int nb_films;
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca.h;
void main()
{char action[10];
gets(action);
/* Deconnexion de la base */
EXEC SQL COMMIT WORK RELEASE;
printf("fin de prog4\n");
exit(0);
} /* main */
pastrouve:
printf("L'acteur %s n'existe pas \n", nom);
return;
sqlerror:
printf("\nMessage d'erreur : \n% .70s \n",
sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
} /* recherche */
pastrouve:
printf("L'acteur %s n'existe pas \n", nom); return;
sqlerror:
printf("\nMessage d'erreur : \n% .70s \n",
sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}/* modification */
• FETCH ramène les tuples un par un dans les variables hôte pour
exploitation par le programme. Après chaque FETCH, le curseur se
déplace du tuple lu au tuple suivant.
for ( ; ; ) {
EXEC SQL FETCH liste_acteurs
INTO :nom, :prenom, :sexe, :nb_films;
while(1)
{EXEC SQL FETCH liste_acteurs
INTO :nom, :prenom, :sexe, :nb_film;
affiche_tuples(sqlca.sqlerrd[2] - nb_tuples);
nb_tuples = sqlca.sqlerrd[2];
/* nb tuples deja retournes */
printf("nb_tuples = %d\n", nb_tuples);
}/* while */
fin_de_boucle:
/* NOT FOUND est vrai quand le fetch ne remplit pas le
tableau */
if ((sqlca.sqlerrd[2] - nb_tuples) > 0)
affiche_tuples(sqlca.sqlerrd[2] - nb_tuples);
void main()
{Connection();
arg = 4 ; nb_rect = 3 ; x=5 ; y=5 ;
EXEC SQL EXECUTE
DECLARE
i INTEGER ;
BEGIN
/* Debut du bloc PL/SQL */
:fact := Factorielle(:arg) ;
for i in 1.. :nb_rect loop
/* calcul du rectangle englobant du polygone i */
p_sig.rectangle(i);
end loop ;
/* détermination du polygone pointé par (x, y) */
:no_poly := p_sig.point_dans_poly(:x, :y);
/* Fin du bloc PL/SQL */
END;
END-EXEC;
printf(" Factorielle de %d = %d\n ", arg, fact) ;
printf(" no_poly = %d\n ", no_poly) ;
}/* fin du main */
6.11.1 Objectif du TD :
Vous commencerez par recopier dans votre répertoire de travail les fichiers et
sous-répertoires se trouvant dans le répertoire :
Dans les fichiers acteur.pc, film.pc et vedette.pc, sont décrites les fonctions
pour gérer les données stockées dans les tables acteur, film et vedette
(recherche, suppression, insertion, modification). On y trouvera également
des fonctions d’édition.
Dans ce TD, vous allez implémenter les fonctions associées à la table vedette.
L'implémentation de ces fonctions s'inspirera de celles de la table acteur.
Cette partie du TD consiste donc à écrire les fonctions insertion_vedette,
modification_vedette, recherche_vedette et suppression_vedette.
Dans insertion_vedette, il faut vérifier que l'acteur ne joue pas déjà un autre
rôle-titre dans le film. On vérifiera également que le rôle n’a pas déjà été
affecté à un autre comédien. Dans ces deux cas, on rejettera la transaction.
De manière générale, lorsque l'on écrit une requête SQL, il est conseillé de
commencer par la mettre au point sous l'interpréteur SQL (sqlplus). Puis, on
l'intègre dans le code C.
Une transaction T1 lit dans un tampon un objet (action a1), le modifie à partir
de la valeur stockée dans le tampon (action a2), alors qu’entre a1 et a2 une
autre transaction T2 a modifié la valeur de l’objet (action a3) :
Transaction T1 Transaction T2
a1 : Read X x1
a3 : Read X x2
x2 + 1 x2
Write x2 X
a 2 : x1 + 1 x 1
Write x1 X
Temps
Une transaction lit deux fois une même donnée et trouve deux valeurs
différentes du fait que la donnée a été modifiée par une transaction
concurrente entre les deux lectures.
Transaction T1 Transaction T2
a1 : Read X x1
Print x1
a3 : Read X x2
x2 + 1 x2
Write x2 X
a2 : Read X x1
Print x1
Temps
Consistence : Les transactions opèrent toujours sur une vue consistante des
données et quand elles se terminent, elles laissent les données dans un état
consistant. Les données sont dites consistantes, tant qu’elles vérifient un certain
nombre d’invariants (unicité de la clé primaire, contrôle d’intégrité référentielle).
Tant qu’une transaction s’exécute, ces invariants peuvent être violés, mais aucune
autre transaction n’est autorisée à les voir et toutes ces inconsistences doivent être
éliminées avant la fin de la transaction.
Durabilité : Lorsque la transaction est committée, ses effets sont guarantis, même
si une panne système intervient. Par contre, en cas de panne, les effets d’une
transaction en cours seront perdus.
Cet algorithme vérifie que les accès aux granules par les transactions
s’effectuent bien dans l’ordre affecté au lancement des transactions (repéré
par les estampilles). Si l’ordre n’est pas respecté, le contrôleur interrompt et
provoque la reprise de la transaction.
FinProc Read
FinProc Write
FinProc Read
FinProc Write
• M5 = consultation exclusive,
On définit les compatibilités entre ces modes opératoires dans une matrice Cij
où Cij=1 si les modes Mi et Mj sont compatibles et 0 sinon.
1 1 1 1 0 0
1 1 0 0 0 0
1 0 1 0 0 0
C=
1 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
m1
...
M= mj
...
m6
On mémorise la liste des opérations en cours sur le granule g dans une liste de
vecteurs Ai(g) tels que :
a1
...
Ai(g) = a j
...
a6
M ⊂ ¬(¬C∗ U Ai ( g ))
i≠ p
Notations employées :
1 1 0 1
0 0 0 0
0 0 1 1
U Ai ( g ) = U U =
i = 1 ,.., 3
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0 11
0 0 1 1 11
0 1 0 1 11
¬C =
0 1 1 1 11
1 1 1 1 11
1 1 1 1 1 1
0 0 0 0 1 1 1 0
0 0 1
0 1 1 1 1
0 1 0 1 1 1 1 0 Il existe un
∗ =
0 1 1 1 1 1 0 mode
1 1
1 1 1 1 1 0 1
opératoire en
cours
1 1 1 1 1 1 incompatible
0 1 avec le mode
opératoire 2
finproc LOCK
Procédure UNLOCK(g, M)
/* on retranche M de la liste des verrous posés sur g */
RetirerDansListeA(g, M);
/* On essaye de débloquer toutes les transactions
en attente de la granule g */
Pour chaque (q, M’) de Q[g] faire
si M ' ⊂ ¬ ( ¬ C ∗ U A i ( g ))
i≠ p
alors AjouterDansListeA(M’,g)
Extraire (q, M’) de Q[g];
Débloquer la transaction Tq;
finsi;
finPour;
finproc UNLOCK
Transaction T1 Transaction T2
LOCK(g1, consultation
protégée)
Attente...
Temps
Afin de limiter les risques de verrou mortel, il est conseillé aux programmeurs
de procéder au verrouillage des tables (explicite ou implicite) dans toutes les
transactions en respectant toujours le même ordre.
• Une requête ne lit jamais de données salies et non committées par une
autre transaction.
• Une donnée peut avoir été modifiée par une autre transaction entre
deux exécutions de la même requête. Il est donc possible qu’une
lecture soit non répétable et que des données fantômes apparaissent.
Pour gérer les conflits d’accès concurrents aux données, Oracle a mis en place
un système automatique de contrôle par verrouillage. Le verrouillage est
réalisé au niveau ligne.
Un verrou exclusif est automatiquement posé sur une donnée lorsque l’on
exécute un ordre SQL SELECT ... FOR UPDATE, INSERT, UPDATE,
DELETE.
• RS (Row Share) : il est posé sur la table par une transaction qui a posé
des verrous sur des lignes dans l’intention de les modifier. Ce verrou
empêche toute autre transaction de verrouiller la table en mode
exclusif.
Modifiez la première ligne depuis l’un des deux postes sans valider la
modification (ie sans changer de ligne). Modifiez cette ligne depuis le
deuxième poste en validant cette fois-ci la modification. Depuis le premier
poste, tentez maintenant de valider la modification. Constatez la réaction
d’Access et testez les différentes alternatives proposées.
• L'autre session doit pouvoir lire les mêmes données. Elles contiennent
les valeurs avant modification par la première session tant que ces
modifications ne sont pas commitées. Refaites la lecture après avoir
committé, vous devez voir cette fois-ci les modifications (mode de
fonctionnement par défaut Read Commited).
Puis, elle exécute une lecture. L’autre session modifie l’une des valeurs lues
et valide (commit) sa modification. Si maintenant la première session exécute
à nouveau la lecture, elle doit toujours voir l’ancienne valeur. Puis, après
avoir exécuté un commit (changement de transaction), lorsqu’elle relance la
lecture, elle voit la nouvelle valeur (mode par défaut : read commited).
Essayez de créer une situation de verrou mortel entre les deux sessions.
Constatez qu'Oracle la détecte et tue la requête qui a démarré en dernier.
• Index bitmap
8.1.1.1 Principe
Lorsque l’on construit un index sur une colonne d’une table, on associe à
chaque valeur de cette colonne la liste des adresses des lignes de la table qui
contiennent cette valeur. L’adresse d’une ligne s’appelle le rowid.
ROWID NOM
------------------ --------------------
AAAAweAAEAAAADVAAG Allen
AAAAweAAEAAAADVAAF Bourvil
AAAAweAAEAAAADVAAA Coluche
AAAAweAAEAAAADVAAE De Funes
AAAAweAAEAAAADVAAB Depardieu
AAAAweAAEAAAADVAAH Marceau
AAAAweAAEAAAADVAAC Richard
AAAAweAAEAAAADVAAD Schneider
53
22 82
11 65
35 92
La hauteur h d'un B-arbre d'ordre d indexant une table de N lignes est égale à
logd N.
50
25 75 90
20 60 64 92
32 34 80 82
Recherche :
50 75
25 62 90
20 22 60 80 82
32 34 64 92
10 15 27
12 14 20 25
on supprime 25 et on applique le si
10 27
12 14 15 20
10 15 27
12 13 14 20 25
10 14 27
12 13 15 20
Exemples d'utilisation :
Blocs de
branchement
A-D L-O
E-G P-R
H-K S-Z
• L’index peut être utilisé à la fois pour les recherches exactes (prédicat
d’égalité) mais aussi pour les recherches sur des intervalles de valeurs
(between, <, >).
• si l’on interroge sur nom, prénom, âge : Oracle utilise l’index sur nom,
prénom,
• si l’on interroge sur nom, âge : Oracle utilise l’index sur nom,
Dans un cluster index, deux tables sont stockées physiquement dans les blocs
de données directement en jointure.
Cette organisation des données est en pratique très rarement utilisée car les
autres types d’opérations sur les tables sont pénalisées par l’organisation
même (balayage d’une seule table, insertion de données dans le cluster).
8.1.3.1 Principe
• Elle est divisée une fois pour toute en p blocs de taille fixe L
• L'adresse relative AR = N * L
base 2
clé 155 1001 1011
pliage
1001 XOR 1011
adresse (155) = 0010 2
Exemple :
clé 155 1 + 5 + 5 = 11
clé 34 7
clé 3455 17
Exemple :
155 mod 16 11
34 mod 16 2
3455 mod 16 15
• A l’intérieur d’un bloc, une ligne est accédée par balayage séquentiel.
1. La table est étendue à chaque fois qu’un bloc est plein; un nouveau
bloc est ajouté à la table.
3. Les adresses (sur le disque) des blocs de la table sont stockées dans un
répertoire accédé en utilisant les M premiers bits pris en compte de la
clé hachée.
XXXXXXX X
0 1
0 0
1 1
S’il est plein, le paquet 1 éclate et les lignes sont distribuées dans les
paquets 01 et 11 :
H(Clé)
XXXXXX XX
0 1 2
00 0
01 1
10 0
11 2
Le paquet 11 éclate à son tour et les lignes sont distribuées dans les blocs 011
et 111 :
P. Buche INA-PG UER-Informatique Bases de données 07/10/2005 page 255
H(Clé)
XXXXX XXX
0 1 2 3
000 0
0
001 1
010 0
011 2
100 0
101
1
110 0
111 3
Avantages :
Inconvénients :
• Si le ième bit vaut 0, cela signifie que la ligne i ne porte pas cette
valeur,
• Si le ième bit vaut 1, cela signifie que la ligne i porte cette valeur.
Intéressant pour :
1 0 1 0 0 1 0
0 1 0 1 0 0 1
1 0 0 0 1 0 1
0 1 1 0 0 0 1
1 0 0 0
AND AND
0 0 1 0
1 1 1 1
0 0 1 0
• la requête analysée,
• le plan d’exécution,
La requête SQL est traduite en plan d’exécution qui met en oeuvre les
algorithmes implémentés dans le moteur du SGBD (algorithmes d’accès aux
éléments d’une table, algorithmes de jointure, ...).
1. l’analyse syntaxique vérifie que la requête SQL est valide d’un point
de vue syntaxique (analyse de la conformité à la grammaire du
langage),
Vérification de la syntaxe et
Analyse de de la sécurité. Recherche
la requête d’une requête identique en
shared pool. Détermination du
plan d’exécution.
Pour bénéficier de cette fonctionnalité, il faut que les requêtes soient écrites
de manière identique (mêmes alias, même nombre d’espaces notamment,
mêmes valeurs constantes dans les clauses where et having, mêmes noms de
variables hôtes).
Il faut utiliser systématiquement des variables hôtes plutôt que des valeurs
constantes pour éviter de refaire l’analyse de la requête.
devient
• Oracle lit séquentiellement bloc par bloc les données stockées dans la
table.
• Le high water mark est le plus grand numéro de bloc qui a contenu
des données depuis la création de la table. Il ne diminue jamais. La
seule façon de le faire baisser est de recréer la table (par un
export/import par exemple).
• Le ROWID est une pseudo-colonne (i.e elle peut être référencée dans
un select mais ne fait pas partie de la table).
• Cette technique d’accès est utilisée dans les index et dans les tables
organisées selon une clé de hashage.
• Oracle recherche dans l’index les lignes vérifiant un critère sur une ou
plusieurs colonnes.
• algorithme de tri-fusion,
• algorithme de hashage.
Il n’utilise pas d’index. Il trie les deux tables sur la ou les colonne(s) de
jointure. Puis, il les fusionne.
• Une table de hashage est construite sur la plus grosse des deux tables.
néanmoins,
les accès considérant peu de lignes sont préférés aux accès par
balayage de plusieurs lignes :
2. accès à une seule ligne sur clé primaire sur table en hash cluster,
4. accès à une ou plusieurs ligne(s) sur une colonne clé de hash cluster,
where D.id_departement=E.id_departement
Execution Plan
---------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: RULE
1 0 NESTED LOOPS
2 1 MERGE JOIN
3 2 SORT (JOIN)
4 3 TABLE ACCESS (FULL) OF 'CLIENT'
5 2 SORT (JOIN)
6 5 TABLE ACCESS (FULL) OF 'EMPLOYE'
7 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPARTEMENT'
8 7 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
Analyse du plan :
• Ordre selon les chemins d’accès : Employe (7) Client(7) , Departement (3),
• Jointure par Sort-merge entre Employe et Client (même rang= 7)
• Jointure par Nested Loop entre Employe-Client et Departement (rang= 3)
where D.id_departement=E.id_departement
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: ALL_ROWS (Cost=8 Card=10100 Bytes=717100)
On peut préciser à Oracle quel optimiseur utiliser pour analyser une requête
(au niveau de la base de données, d’une session ou d’une requête). Les
options sont :
OPTIMIZER_MODE= FIRST_ROWS
Il faut faire attention à la façon dont on écrit une requête SQL. Dans certains
cas, l’optimiseur n’utilisera pas un index existant alors qu’il aurait pu être
utile. Les exemples type sont :
• utilisation de fonctions.
8.3.2.1 Utilisation du !=
Exemple :
Dans tous les cas, on peut utiliser un hint pour être sur qu’Oracle utilise
l’index :
from facture
Comme la valeur NULL n’est pas stockée dans les index, une interrogation
sur NULL dans une requête est exécutée sous la forme d’un balayage de la
table. Par exemple : la table Facture(IdFacture, IdClient, EtatFacture,
DateRéglement,...)
Si l’on applique une fonction sur une colonne indexée, l’index n’est pas utilisé
par l’optimiseur. Par exemple, la table Employe(IdEmploye, Nom, Prenom,
...) :
from employe
Solutions possibles : être sur que les valeurs stockées dans les colonnes sont
toujours en majuscule ou gérer deux colonnes supplémentaires NomMaj et
PrenomMaj gérées par trigger dans lesquelles on mémorise nom et prénom en
majuscule.
from employe
Rappel : Penser à créer des index concaténés sur l’ensemble des colonnes
interrogées dans la clause where de la requête.
from employe
from Employe
Pour optimiser cette requête, on peut créer un index multi-colonnes qui est
plus sélectif que les index séparés.
Il faut déterminer deux paramètres pour organiser une table en hash cluster :
Pour HASHKEYS :
• si le cluster est réalisé sur la clé primaire, hashkeys est égal au nombre
de lignes de la table,
• si le cluster est organisé sur une autre colonne, hashkeys est égal au
nombre de valeurs distinctes pour cette colonne.
Pour SIZE :
NbTotalLignes
SIZE = × average_row_length ×11
,
HASHKEYS
On peut obtenir ces informations sur la table (après avoir calculé ses
statistiques) par l’intermédiaire des vues suivantes :
Création du cluster :
Création de la table :
Lorsque l’accès à une table se fait par un balayage séquentiel, on peut essayer
d’optimiser la lecture de plusieurs manières.
2 solutions possibles :
2ème solution :
/home/test/td_oracle/td10
Pour générer une trace d’exécution d’une requête SQL, la procédure est la
suivante :
Tous les fichiers trace sont générés dans un répertoire commun à tous les
utilisateurs de la base de données. L’ordre SQL ci-dessus permet d’insérer
dans le fichier qui contient la trace d’exécution de votre session un identifiant
unique pour la session dans laquelle vous exécutez la requête.
3) Le fichier trace est généré dans le système de fichiers du serveur Oracle (ie
Castor). Vous devez donc vous connecter obligatoirement sur la machine
serveur pour exécutre les opérations qui suivent. Le répertoire contenant les
fichiers trace est :
/oracle/admin/speinfo816/udump
La colonne rows (ligne fetch) indique que la requête a ramené un seul tuple.
Le plan d’exécution généré pour le select est un accès à la table par rowid
(table access by index rowid), les rowid sont obtenus par une recherche
(index range scan) dans l’index pk_acteur
********************************************************************************
select *
from
acteur where nom='Coluche'
Dans une autre session SQLPLUS, générez la trace d’exécution des scripts
requetes1.sql et requete2.sql d’abord en utilisant l’optimiseur règles, puis
l’optimiseur statistique.
• créer le cluster,
Un bloc de données sous Oracle fait 2K octets (valeur par défaut qui peut être
modifiée). A partir du fichier debut_bal_seq.sql, créez une table à deux
colonnes (un entier et une chaîne fixe de 100 caractères).
• une instance,
• un tablespace SYSTEM,
• deux fichiers de journalisation (journal-après),
• un fichier de contrôle.
Ce sont des fichiers UNIX externes à la base de données (i.e. à l'ensemble des
tablespaces) appelés les fichiers Redo Log.
• Oracle enregistre sur ces fichiers les mises à jour sur la base au fur et à
mesure du déroulement des transactions.
ORACLE ne peut pas écrire à l'infini dans le fichier Redo Log actif.
Lorsque le fichier Redo Log actif est plein, ORACLE bascule l'écriture
des transactions sur le deuxième qui devient actif. Pendant ce temps,
ORACLE consolide la base de données (checkpoint) en recopiant toutes
les transactions commitées du fichier Redo Log plein dans les fichiers de
données. Lorsque le checkpoint est terminé, le fichier Redo Log plein
est prêt à être réutilisé. ORACLE le réutilisera lorsque le fichier Redo
Log actif sera plein à son tour.
Il permet d'initialiser le lien entre une instance et les fichiers d'une base de
données au moment du démarrage de la base. Il contient pour cela le nom de
tous les fichiers Unix associés aux unités de stockage logiques de la base
ORACLE.
Il est accédé en permanence par les processus Unix, car il est le lieu de
mémorisation des états de la base. Par exemple, il contient le numéro du
fichier Redo Log actif.
Redo Log
Data
DataSegment
Segment File
Rollback Segment
Tablespaces
Il analyse la requête dans la shared pool (SQL area) et dans la private SQL
area.
• Dans la SGA.
Remarque : S'il n'y a plus de place en SGA pour les accueillir, les données les
moins récemment utilisées en SGA sont redescendues sur le disque pour leur
laisser la place. La SGA est donc gérée avec un mécanisme de pagination
virtuelle selon un algorithme LRU (Least Recently Used).
Ecrit les buffers modifiés (dirty buffers) par les processus utilisateurs se
trouvant en SGA dans les fichiers de la base.
Les données modifiées par les transactions sont écrites dans un buffer Redo
Log dans la SGA.
• le buffer Redo Log est plein (au tiers), car ce buffer est circulaire. Il
faut que les processus serveur puissent écrire dans le Redo Log buffer
sans attendre sinon il y a risque de contention du système.
L'écriture dans le fichier Redo Log est séquentielle. C'est plus rapide à
exécuter qu'une mise à jour au bon endroit dans la base.
C’est donc lui qui garantit que le fichier Redo Log plein sera réutilisable
lorsque le fichier Redo Log actif sera plein à son tour.
C'est lui qui lit le fichier de contrôle au démarrage de la base pour établir le
lien entre l'instance et les fichiers de la base.
Il libère toutes les ressources utilisées par le processus serveur pour exécuter
la requête du processus utilisateur tombé en panne. Par exemple, il libère les
zones occupées par le processus serveur en SGA, les verrous sur les tuples en
cours de modification, les zones mémoire utilisées par le processus serveur
pour exécuter la requète (la PGA, Program Global Area, la private SQL area,
éventuellement la shared SQL area).
C'est lui qui détecte les verrous mortels (deadlocks) entre les transactions.
Pour cela, il gère dans la SGA un buffer des verrous posés ou demandés par
les transactions.
C'est un processus asynchrone qui est réveillé par le processus LGWR lorsque
le fichier Redo Log actif est plein.
PMON
Dispatcher Shared
Client server DBWR LGWR
Process process
SMON CKPT
Listener
ARCH
Redo Log
Data
DataSegment
Segment File
Rollback Segment
Tablespaces
P. Buche INA-PG UER-Informatique Bases de données 07/10/2005 page 312
9.2.13 Quelques questions
Dans une situation idéale (sans problème financier), combien de disques faut-
il prévoir pour concevoir un serveur de données avec ORACLE et comment
répartir les fichiers sur les différents disques ?
On perd le fichier Redo Log actif : c'était une faiblesse d'ORACLE V6.
L'intégrité de la base n'est plus assurée. Si une panne de courant intervient
dans la foulée, on risque d'avoir perdu des transactions commitées. ORACLE
V7 permet de faire du mirroring sur le fichier Redo Log actif.
• Un disque pour les fichiers Redo Log n°1 et le fichier de contrôle n°2,
• Un périphérique lent pour les fichiers Redo Log archivés (un hexabyte
par exemple),
db_block_buffers = 32 :
On présente les ordres SQL qui permettent de configurer une base de données,
à savoir :
La base a été créée dans le répertoire d’accueil ($HOME) avec les fichiers suivant :
Un tablespace est un espace de stockage dans lequel on crée des tables, des
index, des procédures, des triggers, ...
Créer un tablespace :
• dba_tablespaces
• dba_data_files
initial : taille en nombre d’octets du premier extent alloué pour la table. Par
défaut, Oracle alloue 5 blocs de données (ie 10k).
next : taille en nombre d’octets des extents suivant alloués pour la table. Par
défaut, Oracle alloue 5 blocs de données (ie 10k).
Créer l’utilisateur :
Création du rollback
create rollback segment RSEG
storage
(initial 50K next 50K minextents 2 maxextents 50)
tablespace speinfo ;
dba_rollback_segs ;
rollback_segments=(RSEG)
2.3 Cardinalités 28
2.4 Généralisation-spécialisation 30
3.3 Exercice 70
4. LE LANGAGE SQL 95
4.2 Identificateurs 97