Académique Documents
Professionnel Documents
Culture Documents
modèle Relationnel
Cours 0
Abdelkrim LAHLOU
Lahloukarim@free.fr
Introduction au modèle relationnel
2
Les concepts de base
◼ Concepts structuraux
◼ Le modèle relationnel s’appuie sur trois concepts structuraux de
base: le domaine, la relation (ou table) et l’attribut.
◼ Le domaine est un ensemble de valeurs caractérisé par un nom.
Exemples: le domaine des entiers E= {0,+/- 1, +/-2, ...}; le
domaine des booléens D1= {0,1}; le domaines des couleurs
possibles D2= {vert, bleu,blanc,rouge}; le domaine des
caractères...
◼ La relation, concept central du modèle, peut être définie
grossièrement comme un tableau de données à deux dimensions.
Les colonnes de ce tableau sont appelées attributs. Les lignes
de ce tableau, occurrence de la relation, seront appelées tuples
ou n-uplets
◼ Chaque attribut peut prendre des valeurs dans un domaine.
3
Les concepts de base (suite)
4
Les concepts de base (suite)
◼ Contraintes d’intégrité :
◼ Est un prédicat que doit vérifier un sous ensemble de la base afin que l’on
puisse considérer les informations comme cohérentes. Le rôle des contraintes
d’intégrité est d’assurer la cohérence des données.
On peut isoler plusieurs types de contraintes d’intégrité:
◼ Contrainte de domaine : Concerne le contrôle syntaxique et sémantique d’une
apparaisse comme valeur de clé dans une autre relation (Clé étrangère -->
Clé primaire).
◼ Contrainte d’entité : Contrainte d’intégrité imposant que toute relation
possède une clé primaire et que tout attribut participant à cette clé primaire
soit non nul.
5
Les concepts additionnels
◼ Valeur nulle : Valeur conventionnelle introduite dans une relation pour
représenter une information inconnue ou inapplicable.
◼ Agrégat : Partitionnement horizontal d’une relation en fonction des
valeurs d’un groupe d’attributs, suivi d’un regroupement par application
d’une fonction de calcul sur ensemble.
◼ Les fonctions de calcul sur ensemble les plus souvent proposées
sont les suivantes :
◼ Somme (SUM) permettant de calculer la somme des éléments d’un
ensemble;
◼ Moyenne (AVG) permettant de calculer la moyenne des éléments d’un
ensemble;
◼ Minimum (MIN) permettant de sélectionner l’élément minimum d’un
ensemble;
◼ Maximum (MAX) permettant de calculer l’élément maximum d’un ensemble;
◼ Compte (COUNT) permettant de compter les éléments d’un ensemble.
6
Les concepts additionnels (suite)
◼ Expression d’attributs : Expression arithmétique construite à partir
d’attributs d’une relation et de constantes, par application de fonctions
arithmétiques successives.
◼ exemples :
◼ Salaire = Salaire * 1,10,
◼ Revenu-Annuel = (Salaire-Mensuel * 13,5) + (Commission / 120)
◼ Vue (View) : Une vue est une table virtuelle (c ’est-à-dire non stockée
telle qu’elle) regroupant les données dont un utilisateur a besoin.
◼ Une vue est donc virtuelle, elle n’a donc pas d’existence physique, au moins
lorsqu’elle n’est pas accédée.
◼ Elle peut être obtenue à partir de la sélection d’attributs d ’une ou de
plusieurs tables (jointure)
◼ Elle peut être interrogée comme une table normale de la base.
7
Les concepts additionnels (suite)
◼ Délencheurs (Triggers) : Evénement déclenché suite à l’apparition
d’une condition particulière dans la base de données provoquant
l’exécution d’un programme de traitement de la base composé d’une ou
plusieurs requêtes.
◼ Un trigger peut être déclenché en réaction à une opération sur donnée
(mise à jour d’une table, d’un tuple) ou suite au passage à vrai d’une
condition sur valeurs de données (critère de sélection ou de jointure).
◼ Un trigger est défini au niveau du schéma de la base. Il permet
d’intégrer certains traitements constituant des règles communes à la
base, par exemple le maintien des contraintes d’intégrité ou des
données redondantes.
◼ Procédures : Programme écrit en pseudo-langage procédural offert par
le SGBD. Il est stocké dans le dictionnaire de données après compilation.
◼ Les résultats de la phase de “parsing” et de la phase de détermination
du chemin d’accès sont stockés avec le procédure permettant une
meilleure performance.
8
Convention de formalisme
◼ Formalisme
◼ La table, ses attributs et sa clé primaire
EMPLOYES
Matricule
Nom
Date_emb Notons que, dans cette représentation, le ou les
Code_dept
attributs composant la clé primaire sont soulignés
9
Opérateurs algébriques de base sur les tables
relationnelles
1 - Sélection
2 - Projection
3 - Jointure
10
1 - Sélection
Patient Patient
Id-P Nom Prénom Ville Id-P Nom Prénom Ville
1
2
3
Lebeau
Troger
Doe
Jacques
Zoe
John
Paris
Evry
Paris
s 1
2
3
Lebeau
Troger
Doe
Jacques
Zoe
John
Paris
Evry
Paris
4 Perry Paule Valenton 4 Perry Paule Valenton
11
2 - Projection
Patient Patient
Id-P Nom Prénom Ville Id-P Nom Prénom Ville
2
Lebeau
Troger
Jacques
Zoe
Paris
Evry
p 1
2
3
Lebeau
Troger
Doe
Jacques
Zoe
John
Paris
Evry
Paris
4 Perry Paule Valenton
3 Doe John Paris
4 Perry Paule Valenton
12
3 - Jointure
Patient Visite
Id-P Nom Prénom Ville Id-D Id-P Id-V Date Prix
1 2 1 15 juin 250
1 Lebeau Jacques Paris
1 1 2 12 août 180
2 2 3 13 juillet 350
2 Troger Zoe Evry
2 3 4 1 mars 250
3 Doe John Paris
4 Perry Paule Valenton
Remarque :
Exemple :
CREATE TABLE Eleves (Nom CHAR(15) PRIMARY KEY,
Prenom VARCHAR(25) NOT NULL);
17
SQL-DML
Un DML autorise toutes les actions propres à la
manipulation des données :
◼ insertion de nouvelles données (INSERT)
◼ suppression de données (DELETE)
◼ mise à jour de données (UPDATE)
◼ interrogation de la base (SELECT)
Les commandes DML sont la partie centrale de SQL
Exemple :
SELECT DISTINCT Nom, Prenom
FROM Eleves WHERE UPPER(Nom) LIKE ‘L%’ ;
18
SQL-DCL
19
Les types de base dans SQL
Les types de données
SQL offre plusieurs types de données dont les types de base suivants :
CHAR(n) chaîne de n caractères
Remarques :
- Le type booléen n’existe pas dans SQL, il peut toutefois être simulé avec CHAR(1) ou NUMERIC (1).
- Par exemple, le SGBD Oracle accepte les types numériques SQL2 mais il les traduit dans ses propres
types. NUMERIC en NUMBER et VARCHAR en VARCHAR2
21
Les types de données Oracle
Oracle offre plusieurs types de données dont les types de base suivants :
CHAR(n) chaîne de n caractères (max 2000)
VARCHAR2(n) chaîne de caractères de longueur variable d ’au plus n caractères
LONG chaîne de caractères de longueur 2GB. Seule une colonne de type
LONG est admise par table!
BLOB grand objet binaire (Binary Large Object) peut stocker jusqu’à 4Go
de données binaires non structurées, texte, image, vidéo, son, etc…
CLOB (Character LOB), NCLOB(National CLOB) et BFILE(Binary FILE) à
utiliser plutôt que le type LONG
RAW(n) champ de longueur variable n, utilisé pour stocker des données
binaires
DATE date+heure de taille fixe et dont le format par défaut est ‘DD-MMM-YY’
NUMBER (n,d) type numérique pour les entiers et les réels,
n: nombre total de chiffres (max 38)
d: nombre total de chiffres décimaux (-84 à 127)
Les types dérivés sont: INT, DEC, SMALLINT, et REAL.
Remarques :
- Le type booléen n’existe pas dans Oracle, il peut toutefois être simulé avec CHAR(1) ou NUMBER (1).
- Oracle accepte les types numériques SQL2 mais il les traduit dans ses propres types
- Les types NCHAR(n) et NVARCHAR2(n) utilisent des caractères au format UTF-16
22
Définition des données
26
Modification de la structure d’une table
Il est possible de modifier la structure d’une table même si des
enregistrements ont déjà été insérés
27
Exemple de modification de schéma de table
Soit la relation :
Produit(NumP, Nom, PrixUnitaire, Quantite, #NumFabricant)
NumP est la clé primaire de la table Produit et NumFabricant est clé
étrangère référençant l’attribut NumF de la table Fabricant
29
Destruction d’une table
La destruction d’une table efface toutes les données qu’elle
contient ainsi que sa structure.
Exemple :
DROP TABLE Produit ;
30
Chargement et mise à jour
de la base de données
Exemple :
INSERT INTO client(num, nom) VALUES (32, ’Dupont’ ) ;
32
Mise à jour d’un enregistrement
UPDATE <table> SET
<column i > = <expression i >, …,
<column j > = <expression j >,
[WHERE <condition>];
Exemple :
DELETE FROM client WHERE num = 32 ;
Attention :
DELETE FROM client ;
-- supprime toutes les données de la table Client
34
Commit et Rollback
◼ Une séquence de modifications (insert, update ou delete)
est appelée une transaction.
◼ Une modification est temporairement stockée dans le
système de la base de données. Elle deviendra permanente
seulement après une instruction COMMIT.
◼ Tant que l’instruction COMMIT n’a pas encore été appelée,
il est possible de « défaire » toutes les modifications, pour
se faire, l’instruction ROLLBACK est utilisée.
◼ Il est recommandé de confirmer chaque modification avec
un COMMIT. Cette instruction est toutefois implicitement
exécutée lorsqu’une session est terminée.
35
Interrogation de la base
de données
37
Interrogation de la base
◼ SELECT permet d’indiquer quelles colonnes ou expressions
doivent être retournées par l’interrogation. Le symbole *
signifie que toutes les colonnes de la tables sont
sélectionnées. DISTINCT permet d’éliminer les doublons
éventuels du résultat
◼ FROM liste les tables participant à l’interrogation
◼ WHERE permet de spécifier quelles sont les lignes à
sélectionner dans une table ou dans le produit cartésien de
plusieurs tables. Elle est suivie d’un prédicat qui sera
évalué pour chaque ligne. Les lignes pour lesquelles le
prédicat est vrai seront sélectionnées
38
Interrogation de la base
◼ GROUP BY permet de subdiviser la table en groupes,
chaque groupe étant l’ensemble des lignes ayant une
valeur commune
◼ HAVING sert à préciser quels groupes doivent être
sélectionnés
◼ ORDER BY précise l’ordre croissant (ASC) ou décroissant
(DESC) dans lequel la liste des lignes sélectionnées sera
rendue en résultat (par défaut : ASC)
39
Fonctions et opérateurs
Pour les différents types de données, plusieurs
opérateurs et fonctions sont fournis :
◼ Pour les nombres :
ABS, COS, SIN, EXP, LOG, POWER, MOD, SQRT, +, -, *, /, …
40
Opérateurs de comparaison
Les trois types d’expressions (arithmétiques, caractères ou
dates) peuvent être comparés au moyen des opérateurs. Pour
le type date, la relation d’ordre est l’ordre chronologique; pour
le type alphanumérique, la relation d’ordre est l’ordre
lexicographique.
45
Sous-requêtes (Suite)
46
Jointures
- Jointure interne
- Jointure naturelle
- Jointure externe
Jointure interne (Définition)
48
Jointure interne (Produit cartésien)
49
Jointure interne (Exemple)
50
Jointure interne (Exemple)
51
Jointure interne (Syntaxe SQL)
52
Jointure naturelle
53
Jointure externe (Définition)
54
Jointure externe (Produit cartésien)
55
Jointure externe (Exemple)
56
Jointure externe (Exemple)
57
Jointure externe (Exemple)
58
Jointure externe (gauche)
59
Jointure externe (droite)
60
Jointure externe (Exemple)
61
Jointure externe (Exemple)
63
Division
Division (1/3)
65
Division (2/3)
Table Patient Table Soin
DocNum PatNum MalCode
PatNum PatNom Age
D1 P1 M2
P1 Riri 11
D1 P2 M3
P2 Fifi 12
D1 P3 M2
P3 Loulou 13
D2 P3 M3
P4 Donald 45
D2 P2 M2
P5 Minnie 39
D2 P1 M3
P6 Picsou 70
D2 P2 M6
P7 Mickey 55
D3 P1 M6
P8 Daisy 38
D4 P4 M7
P9 Rapetou 55
D4 P2 M3
D4 P1 M5 66
Division Solution évidente (3/4)
67
Division Solution optimale (4/4)
68
Concepts avancés du
Langage SQL
Cours 5
Gestion de la confidentialité
- Confidentialité et vues
- Les vues virtuelles
- Les vues matérialisées
- Confidentialité et droits d’accès
Confidentialité et indépendance
71
Contexte
Analyse syntaxique
ANALYSEUR Analyse sémantique
Gestion des schémas
Modification de requêtes
META-BASE TRADUCTEUR Contrôle d'intégrité
Contrôle d'autorisation
Ordonnancement
OPTIMISEUR Optimisation
Élaboration d'un plan
Exécution du plan
Méthodes d'accès
Plan d'Accès EXECUTEUR Contrôle de concurrence
Atomicité des transactions
BD
72
Gestion du schéma
◼ Les schémas de BD sont
gérés comme une base SCHEMA
de données relationnelle
appelée méta-base (ou
catalogue)
TABLES CONTRAINTES
◼ SQL2 normalise les tables
de la méta-base (ou plutôt
des vues de ces tables)
COLONNES CLES DOMAINES
73
Vision globale d’une BD
Programme Programme
d’application 1 d’application n
Niveau BD conceptuelle
Conceptuel
Niveau BD physique
Interne
74
Niveau externe
Appelé également niveau des vues
◼ Un groupe d’utilisateurs d’une base de données
conceptuelle peut avoir besoin :
◼ d’une partie seulement des informations de la base de
données, et/ou
◼ de ces informations structurées différemment
75
Vues (Définition)
Exemple : S = {E(emp,dep);M(dep,mgr);S(emp,sal)}
Vue V :
◼ tables = {EM(emp,mgr);BS(emp,sal)}
76
Vues
77
Définition de vue
◼ Définition de la vue
Base de données virtuelle dont le schéma et le contenu sont
dérivés de la base réelle par un ensemble de requêtes (toute
ensemble d’expressions nommées de la forme T = e sur le schéma S
de BD est une vue sur S)
1. Vues virtuelles
2. Vues matérialisées
79
Vues virtuelles
◼ Vue virtuelle
◼ les relations de la vue ne sont pas stockées
◼ seule sa définition est stockée
◼ le SGBD doit traduire les requêtes et mises à jour sur la
vue en requêtes et mises à jour sur la BD conceptuelle
81
Les vues virtuelles
(ou vues logiques)
Utilisation des vues
83
Utilisation des vues
La requête pour créer la vue peut contenir toutes les clauses d'un select
sauf Order by
◼ Conditions suffisantes :
◼ Clés des tables participantes déductibles de la vue
◼ Vues mono-table avec clé de la table
88
Mise à jour avec une vue
◼ Vue comportant suffisamment d'informations pour
permettre un report des mises à jour dans la base sans
ambiguïté.
◼ On peut effectuer des UPDATE à travers une vue, avec
les conditions du DELETE, et en plus :
◼ Les colonnes modifiées sont des colonnes réelles de la table (pas
des expressions)
◼ On peut effectuer des INSERT à travers une vue, avec
les conditions du UPDATE, et en plus :
◼ Toute colonne « NOT NULL" de la table représentée par la vue
est présente dans la vue
Exemple :
UPDATE vinsbordeaux SET degré = degré + 2 ; 89
Interrogation des vues
90
Schéma fonctionnel
Base
Réponse
Vue
R1
F Q
...
Rn
91
Modification de requêtes
◼ (1) Requête :
SELECT nom, prénom FROM grosbuveurs
WHERE adresse LIKE "versailles".
◼ (2) Définition de vue
CREATE VIEW grosbuveurs AS
SELECT nb,nom,prénom, adresse FROM buveurs b, abus a
WHERE b.nb = a.nb AND a.quantité > 10 ;
◼ (3) Requête modifiée
SELECT nom, prénom FROM buveurs b, abus a
WHERE b.adresse LIKE "Versailles" AND b.nb = a.nb AND
a.quantité > 10 ;
93
Concaténation d'arbres
Résultat
B.NOM, B.PRENOM
Vue Vue
ABUS A
94
Classification des vues
Ensemble de toutes les vues Vue théoriquement
mettable à jour
Mettable à jour en SQL
( la qualification peut invoquer
plusieurs tables)
Vues multi-tables
Vues mono-tables
avec clés
avec clés
95
Approche théorique
◼ Problème
◼ Il peut manquer des données dans la vue pour reporter
dans la BD
◼ Comment définir une stratégie de report cohérente ?
Mise à jour u
Vue Vue'
as Question V as Question V
◼ Datawarehouse :
Ensemble de données archivées variant dans le temps, organisées
par sujets, consolidées dans une base de données unique, gérée
dans un environnement de stockage particulier, aidant à la prise de
décision dans l’entreprise.
◼ Vue concrète :
Idéale pour modéliser un sous-ensemble de données extrait du
datawarehouse et ciblé sur un sujet unique
99
Vue concrète
◼ Vue concrète (Concrete view)
◼ Table calculée à partir des tables de la base par une
requête et matérialisée sur disques par le SGBD.
101
Exemple (2)
102
Le treillis des vues
103
Problème de mise à jour
◼ La vue peut être distante
◼ on envoie seulement le « delta »
◼ les tuples ajoutés et les tuples supprimés
◼ Vue auto-maintenable (Self-maintenable view)
◼ Vue contenant suffisamment d'information pour être mise
à jour à partir des mises à jour des relations de base, sans
accès aux tuples des relations de la base.
◼ Agrégats auto-maintenables (Self-maintenable
aggregates)
◼ Ensemble d'agrégats pouvant être calculées à partir des
anciennes valeurs des fonctions d'agrégats et des mises à
jour des données de base servant au calcul de la vue.
104
Vue auto-maintenable ou non
mise à jour D mise à jour D
BD BD
V q V
F(D) F’(D)
F(D) D
F’(q ,D)
V’
BD’ BD’
V’
◼ Quelques règles
◼ concrétiser les vues multidimensionnelles de base
◼ éventuellement concrétiser des vues compactées
◼ permet d’optimiser le « drill-down »
◼ évite les calculs d’agrégats dynamiques
◼ ne jamais concrétiser des vues non auto-maintenables
106
Confidentialité
◼ Principes :
◼ objectifs :
◼ outils :
◼ déclaration de l’utilisateur à la connexion
◼ catégories de pouvoir (mises à jour du schéma, mises
à jour des données, consultation)
◼ autorisations locales à chaque table
◼ vues
107
Confidentialité et droits d’accès
Commande SQL pour donner des droits :
GRANT privilèges ON table (ou vue) TO user
[WITH GRANT OPTION] ;
avec :
◼ privilèges = ALL ou
{select, insert, update, delete, alter, index}
109
Gestion de la concurrence
- Transactions
- Gestion de la persistance
- Gestion de la reprise sur panne
- Gestion de la concurrence d’accès
Suite des problèmes BD
◼ La résolution des trois problèmes suivants
(persistance, reprise sur panne, concurrence)
nécessite de manipuler les données sous le
contrôle de transactions
◼ Une transaction est une suite d’ordres SGBD tels
que tous sont exécutés ou aucun ne l’est
◼ début de transaction : premier ordre qui suit la
connexion au serveur ou la fin d’une transaction
◼ fin de transaction :
◼ annulation, ou
◼ confirmation (la transaction est alors dite validée)
111
Gestion des transactions
Définition
◼ Une transaction est la plus petite unité logique de traitements regroupant un ensemble d’opérations
élémentaires (commandes SQL). Ces opérations doivent être exécutées entièrement, soit pas du
tout, permettant ainsi à la base de données de passer d’un état cohérent à un nouvel état cohérent.
Exemple : Transfert bancaire d’un compte à un autre
113
Confirmation d’une transaction
◼ Explicites : COMMIT;
◼ Implicites (Oracle) :
◼ commande de déconnexion en mode interactif
◼ tout ordre de mise à jour du schéma (create, drop,
alter…)
◼ Commande « grant »
◼ toute mise à jour des données en mode de
confirmation automatique (autocommit on)
◼
114
Annulation d’une transaction
◼ Explicites : ROLLBACK;
◼ Implicites : déconnexion anormale (autre que
« exit »)
115
Remarques sur les transactions
116
Gestion de la Persistance
◼ Certaines mises à jour sont provisoires, d’autres
doivent persister
◼ En fin de session, une donnée persiste si et
seulement si :
◼ elle est dans une table
◼ une confirmation a eu lieu
◼ instruction de confirmation : Commit
◼ instruction d’annulation : Rollback
◼ Une mise à jour persiste ssi elle fait partie d’une
« transaction validée »
117
Gestion de la Reprise sur panne
◼ Exemple de situation :
◼ données : Thérèse a un compte à la BF
Félix a un compte à la BF
◼ action : Thérèse doit verser 1000 euros à Félix
serveur
T A B État final ?
1 2
122
Concurrence
123
Situation de concurrence
Temps
Agence 1 Agence 2
Nextlibre()
2 Nextlibre()
2
update réservation
set client = ‘Félix’ update réservation
where place = 2; set client = ‘Thérèse’
where place = 2;
124
Situation de concurrence
Temps
Agence 1 Agence 2
Nextlibre()
2 Nextlibre()
Demande de verrou 2
Verrou accordé
update réservation
set client = ‘Félix’ update réservation
where place = 2; set client = ‘Thérèse’
. where place = 2;
.
Verrou relaché .
attente
update réservation
set client = ‘Thérèse’ where place = 2;
125
Situation de concurrence
Temps
Agence 1 Agence 2
Demande de verrou
Verrou accordé
Nextlibre()
2 Nextlibre()
2
update réservation update réservation
set client = ‘Félix’ set client = ‘Thérèse’
where place = 2; where place = 2;
.
.
Verrou relaché attente
.
update réservation
set client = ‘Thérèse’ where place = 2;
126
Situation de concurrence
Temps
Agence 1 Agence 2
Demande de verrou
Verrou accordé
Demande de verrou
Nextlibre()
2 .
.
.
attente
update réservation
set client = ‘Félix’
where place = 2;
Verrou relaché Verrou accordé
Nextlibre()
3
update réservation
set client = ‘Thérèse’ where place = 3;
127
Verrouillage des données
Concepts de base
◼ Pour que l’exécution simultanée de plusieurs transactions donne le même résultat qu’une
exécution séquentielle, la solution utilisée consiste à verrouiller momentanément les données
utilisées par une transaction jusqu’à la fin de la mise à jour. Les autres transactions demandant
ces données sont mises en attente jusqu’à leur libération (déverrouillage). Cette technique de
verrouillage permet d’éviter les interactions destructives des transactions, c’est-à-dire les
opérations n’assurant pas l’intégrité des données. Le cas typique destructive est la perte de
mise à jour
La figure suivante donne un exemple de perte de mise à jour.
Transaction 1 Temps Transaction 2
Lecture A (A=50) t0
Calcul A = A + 10 t1 Lecture A (A=50)
Ecriture A (A=60) t2 Calcul A = A+20
t3 Ecriture A (A=70)
Validation T1 t4
t5 Validation T2
L’absence de verrouillage de données a pour conséquence la perte de la mise à jour faite par la
transaction T1. Au lieu que D1 ait comme résultat final la valeur 80 (50+10+20), elle n’a que
70, car la mise à jour effectuée par T1 n’a pas été prise en compte.
Le verrouillage s’applique d’une façon générale à une ressource. Une ressource peut correspondre
aux objets créés par les utilisateurs tels que les tables (ou uniquement quelques lignes d’une
table), ainsi qu’aux objets système tels que les éléments du dictionnaire et la mémoire. 128
Verrouillage des données
Granule de verrouillage
◼ Un paramètre important qui affecte les performances est le
niveau de verrouillage des données, appelé aussi granule
de verrouillage. Ce granule peut être logique (une table,
une ligne) ou physique (segment, extension, bloc, fichier).
La taille du granule influence le degré de concurrence. Un
petit granule favorise la concurrence, mais il entraîne des
contrôles plus importants.
◼ Généralement les petits granules (ligne) sont mieux adaptés
aux transactions courtes ne manipulant qu’un faible volume
de données (quelques lignes), alors que des granules plus
importants sont mieux adaptés aux transactions lourdes.
129
Verrouillage des données
Granule de verrouillage
◼ Types de verrous :
◼ sur relations (verrous X - exclusive)
◼ sur n-uplets (verrous RX – row exclusive)
◼ Incompatibilités :
◼ X/X ou X/RX : même table
◼ RX/RX : n-uplets communs au deux sélections
130
Verrouillage des données
Demande de verrous
◼ Demande de verrous :
◼ Explicite : LOCK Table T in EXCLUSIVE MODE
◼ Implicite : Update, Delete
◼ Attribution de verrous :
◼ Si incompatibilité sur les ressources à verrouiller avec
verrous déjà accordés , alors mise en attente
◼ Relâche de verrous :
◼ Validation (Commit)
◼ Annulation (Rollback)
131
Verrouillage des données
Types de verrouillage
◼ Oracle utilise deux niveaux de verrouillage des données :
verrouillage des lignes (row locks) et verrouillage des tables.
La combinaison de ces deux niveaux de verrouillage donne
lieu aux cinq modes de verrouillage suivants :
133
Mises à jour concurrentes
1. Demande de verrou sur les n-uplets satisfaisant la
condition de sélection (where)
2. S’il n’y a pas d’incompatibilité avec les verrous déjà
posés, alors obtention du verrou et exécution de la mise
à jour sur la « table virtuelle locale »
3. Sinon attente de la relâche des verrous incompatibles,
puis
• obtention du verrou
• réévaluation de la condition de sélection sur les n-
uplets présélectionnés
• Exécution de la mise à jour sur cette nouvelle
sélection
4. Relâche du verrou lors de la validation ou annulation
134
Remarques
client 1 client 2
attente
● Support for embedded data models reduces I/O activity on database system
● Indexes support faster queries and can include keys from embedded documents
and array
● CRUD
● Data aggregation
● Text search
● Geospatial queries
MongoDB: Key features
High Availability
● Automatic failover
● Data redundancy
Horizontal Scalability
Source: mongodb.com
Documents: BSON types
Double 1 “double”
String 2 “string”
Object 3 “object”
Array 4 “array”
ObjectId 7 “objectId”
Documents: BSON types
Boolean 8 "bool"
Date 9 "date"
Null 10 "null"
JavaScript 13 "javascript"
Timestamp 17 "timestamp"
Decimal128 19 "decimal"
It is immutable
If an inserted document omits the _id field, the MongoDB driver automatically
generates an ObjectId for the _id field.
Documents : Fields
MongoDB uses the dot notation to access the elements of an array and to
access the fields of an embedded document
MongoDB preserves the order of the document fields following write operations
except for the following cases:
Source: mongodb.com
Collections: Creation
Explicit creation:
Implicit creation:
If a collection does not exist, MongoDB creates the collection when you first
store data for that collection
Collections: Deletion
To drop a collection:
db.<collection_name>.drop()
Collections: Schema
By default, a collection does not require its documents to have the same
schema
If a database does not exist, MongoDB creates the database when you first
store data for that database
Views
Views: Definition
Using createCollection:
db.createCollection(
"<viewName>",
{
"viewOn" : "<source>",
"pipeline" : [<pipeline>],
"collation" : { <collation> }
}
)
Views: Creation
Using createView:
db.createView(
"<viewName>",
"<source>",
[<pipeline>],
{
"collation" : { <collation> }
}
)
Views: Example
db.createView(
"managementFeedback",
"survey",
)
Views: Example
If the collection does not currently exist, insert operations will create the
collection
● db.<collection_name>.insertOne()
● db.<collection_name>.insertMany()
Create: Examples
db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom:
"cm" } }
])
Read: Definition
● db.collection.find()
You can specify query filters or criteria that identify the documents to return
Read: Examples
● db.<collection_name>.updateOne()
● db.<collection_name>.updateMany()
● db.<collection_name>.replaceOne()
● db.<collection_name>.update()
Once set, you cannot update the value of the _id field nor can you replace an existing
document with a replacement document that has a different _id field value
Update: Definition
You can specify criteria, or filters, that identify the documents to update
To use the update operators, pass to the update methods an update document
of the form:
{
<update operator>: { <field1>: <value1>, ... },
<update operator>: { <field2>: <value2>, ... }
}
Update operators: Fields
Name Description
$currentDate Sets the value of a field to current date, either as a Date or a Timestamp.
$min Only updates the field if the specified value is less than the existing field value.
$max Only updates the field if the specified value is greater than the existing field value.
$setOnInsert Sets the value of a field if an update results in an insert of a document. Has no effect on update
operations that modify existing documents.
Name Description
$ Acts as a placeholder to update the first element that matches the query condition.
$[] Acts as a placeholder to update all elements in an array for the documents that match the
query condition.
$[<identifier>] Acts as a placeholder to update all elements that match the arrayFilters condition for the
documents that match the query condition.
$addToSet Adds elements to an array only if they do not already exist in the set.
Name Description
$each Modifies the $push and $addToSet operators to append multiple items for array updates.
$position Modifies the $push operator to specify the position in the array to add elements.
$slice Modifies the $push operator to limit the size of updated arrays.
$bit Performs bitwise AND, OR, and XOR updates of integer values
Update: Examples
Some update operators, such as $set and $currentDate, will create the field if
the field does not exist.
db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
)
Update: Examples
db.inventory.updateMany(
{ "qty": { $lt: 50 } },
{
$set: { "size.uom": "in", status: "P" },
$currentDate: { lastModified: true }
}
)
Update: Examples
db.inventory.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)
Update: additional methods
db.<collection_name>.findOneAndReplace()
db.<collection_name>.findOneAndUpdate()
db.<collection_name>.findAndModify()
db.<collection_name>.bulkWrite()
Delete: Definition
Delete operations remove documents from a collection
● db.collection.deleteOne()
● db.collection.deleteMany()
You can specify criteria, or filters, that identify the documents to remove
Delete operations do not drop indexes, even if deleting all documents from a collection
Delete: Examples
db.<collection_name>.remove(<query>,<justOne>)
db.<collection_name>.findOneAndDelete()
Bulk write
Bulk write: Definition
MongoDB provides clients the ability to perform write operations in bulk with
the method:
db.<collection_name>.bulkWrite()
db.<collection_name>.bulkWrite(
[ <operation 1>, <operation 2>, ... ],
{
ordered : <boolean>
}
)
Bulk write: Syntax
● InsertOne:
db.<collection_name>.bulkWrite( [
{ insertOne : { "document" : <document> } }
])
● updateOne (same as updateMany):
db.<collection_name>.bulkWrite( [
{ updateOne : { "filter": <document>, "update": <document or pipeline> } }
])
Bulk write: Syntax
● replaceOne:
db.<collection_name>.bulkWrite([
{ replaceOne : { "filter" : <document>, "replacement" : <document> } }
])
db.<collection_name>.bulkWrite([
{ deleteOne : { "filter" : <document> } }
])
Bulk write: Example
try {
db.characters.bulkWrite([
{ insertOne: { "document": { "_id": 4, "char": "Dithras", "class": "barbarian", "lvl": 4 } } },
{ updateOne : {
"filter" : { "char" : "Eldon" },
"update" : { $set : { "status" : "Critical Injury" } }
} },
{ deleteOne : { "filter" : { "char" : "Brisbane"} } },
{ replaceOne : {
"filter" : { "char" : "Meldane" },
"replacement" : { "char" : "Tanys", "class" : "oracle", "lvl": 4 }
}}
]);
} catch (e) {
print(e);
}
Text Search
Text Search
MongoDB supports query operations that perform a text search of string content
To perform text search queries, you must have a text index on your collection
A text index can include one or several fields whose value is a string or an array of
string elements
The following creates an index over the fields name and description of the collection
stores:
Use the $text query operator to perform text searches on a collection with a text
index
$text will tokenize the search string using whitespace and most punctuation as
delimiters, and perform a logical OR of all such tokens in the search string
The following query will find all stores containing any terms from the list "coffee",
"shop", and "java":
You can also search for exact phrases by wrapping them in double-quotes
The following will find all stores containing "java" or "shop" but not "coffee":
Text search queries will compute a relevance score for each document that
specifies how well a document matches the query
To sort the results in order of relevance score, you must explicitly project the $meta
textScore field and sort on it
db.stores.find(
{ $text: { $search: "java coffee shop" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
Aggregation Pipeline
Aggregation Pipeline: Definition
The aggregation pipeline is a framework for data aggregation modeled on the
concept of data processing pipelines. MongoDB provides the
db.<collection_name>.aggregate() method to run the aggregation pipeline
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
Aggregation Pipeline: Stages
Each stage transforms the documents as they pass through the pipeline
Pipeline stages do not need to produce one output document for every input
document
Stage Description
$count Returns a count of the number of documents at this stage of the aggregation pipeline
$group Groups input documents by a specified identifier expression and applies the accumulator
expression(s), if specified, to each group
$limit Passes the first n documents unmodified to the pipeline where n is the specified limit
$match Filters the document stream to allow only matching documents to pass unmodified into the next
pipeline stage
$project Reshapes each document in the stream, such as by adding new fields or removing existing
fields
Considering that documents in the zipcodes collection have the following form:
{
"_id": "10280",
"city": "NEW YORK",
"state": "NY",
"pop": 5574,
"loc": [
-74.016323,
40.710537
]
}
Aggregation Pipeline: Examples
db.zipcodes.aggregate( [
{ $group: { _id: "$state", totalPop: { $sum: "$pop" } } },
{ $match: { totalPop: { $gte: 10*1000*1000 } } }
])
The following operation returns average city population by state
db.zipcodes.aggregate( [
{ $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } },
{ $group: { _id: "$_id.state", avgCityPop: { $avg: "$pop" } } }
])
Aggregation Pipeline: Examples
Considering that the documents in the users collection have the following form:
{
_id : "jane",
joined : ISODate("2011-03-02"),
likes : ["golf", "racquetball"]
}
Aggregation Pipeline: Examples
The following operation returns user names in upper case and in alphabetical
order:
db.users.aggregate(
[
{ $project : { name:{$toUpper:"$_id"} , _id:0 } },
{ $sort : { name : 1 } }
]
)
Aggregation Pipeline: Examples
The following operation returns user names sorted by the month they joined:
db.users.aggregate(
[
{ $project :
{
month_joined : { $month : "$joined" },
name : "$_id",
_id : 0
}
},
{ $sort : { month_joined : 1 } }
]
)
Aggregation Pipeline: Examples
db.users.aggregate(
[
{ $unwind : "$likes" },
{ $group : { _id : "$likes" , number : { $sum : 1 } } },
{ $sort : { number : -1 } },
{ $limit : 5 }
]
)
Data modeling
Data modeling
With schema validation, you can enforce document validation rules for a
collection
The key consideration for the structure of your documents is the decision to
embed or to use references
Data modeling: Embedded data
Embedded data models make it possible to retrieve and update related data in
a single atomic operation
References store the relationships between data by including links from one document
to another
● when embedding would result in duplication of data but would not provide
sufficient read performance advantages to outweigh the implications of
the duplication
● to represent more complex many-to-many relationships
● to model large hierarchical data sets
Data modeling: One-to-Many relationships
Embed the N side if the cardinality is one-to-few and there is no need to access
the embedded object outside the context of the parent object
● Motivations
● Types
NoSQL ● Benefits
● Drawbacks
● NoSQL VS SQL
Definition
NoSQL (non SQL or not only SQL) databases are non tabular, and store data
differently than relational tables
They provide flexible schemas and scale easily with large amounts of data and
high user loads
Motivations
NoSQL databases have existed since the late 1960s, but they really emerged in
the late 2000s
More applications
More data
Agile methods
Types
Key-value databases are a simpler type of database where each item contains
keys and values
Horizontal scaling
Fast queries
Less consistent
4
3 Structure logique
6
Structure logique
(suite)
7
Structure logique
(suite)
B LO C
U n s e g m e n t c o r r e s p o n d à u n e n s e m b le d ’e x te n s io n s a llo u é e s à u n e s tr u c tu r e
lo g iq u e (D A T A S E G M E N T , IN D E X S E G M E N T , R O L L B A C K S E G M E N T ,
TEM PO RARY SEG M EN T,
8
Structure logique
Bloc de données
Un bloc de données est la plus petite unité logique d’entrée/sortie utilisée
par Oracle. il est également appelé bloc logique ou page. Cette notion de
bloc de données est différente de celle de bloc physique utilisé par les
systèmes d’exploitation.
Les blocs de données sont organisés de la même façon, quel que soit leur
contenu : données, Index ou Cluster.
9
Structure logique
Extension
L’extension est une unité logique d’allocation d’espace composée d’un ensemble
contigu de blocs allouées simultanément à un segment. Tout segment est
initialement créé avec au moins une extension. Cette extension est appelée
extension initiale . Lorsque l’espace d’un segment est complètement utilisé,
Oracle lui attribue une nouvelle extension (extension supplémentaire).
Paramètres relatifs à l’utilisation des extensions : Ces paramètres sont définis
à l’aide de clause STORAGE.
STORAGE (INITIAL n1 EXTENT n2 MINEXTENT m1 MAXEXTENT m2
PCTINCREASE p)
avec
n1 : Taille en octet de la première extension allouée lorsqu’un segment est créé.
n2 : Taille en octets de la deuxième extension allouée au segment.
m1 : Nombre d’extensions allouées à la création du segment.
m2 : Nombre total d’extensions pouvant être allouées à un segment.
p : Pourcentage d’accroissement de la taille du segment i+1 par rapport à celle du
segment i (i>2).
10
Structure logique
Extension
Exemple :
STORAGE (INITIAL 100K NEXT 100K MINEXTENT 1 MAXEXTENT 5 PCTINCREASE 50)
La taille des différentes extensions est la suivante :
1ère extension : 100 K
2ème extension : 100 K
3ème extension : arrondi (100*1,5) = 150 K
4ème extension arrondi (150*1,5) = 225 K
5ème extension arrondi (225*1,5) = 337 K
Remarque : La clause STORAGE peut être utilisée dans des différentes commandes de
création ou de modification d’objets Oracle (tables, index, etc.). Si cette clause est définie à
différents niveaux, l’ordre de priorité est le suivant :
Tout paramètre défini au niveau d’un objet Oracle remplace celui défini au niveau du
tablespace.
A tout paramètre non défini au niveau d’un objet Oracle est appliquée par défaut la valeur définie au
niveau tablespace.
En cas d’absence de définition de paramètres au niveau du tablespace, Oracle applique des valeurs
par défaut.
Si des paramètres sont modifiés, les nouvelles valeurs s’appliquent uniquement aux extensions non
encore allouées.
11
Structure logique
Segment
Un Segment est un ensemble d’une ou plusieurs extensions contenant les
données d’une structure logique dans un tablespace. A une table, par
exemple, est allouée une ou plusieurs extensions.
Il existe cinq types de segments :
Segments de données,
Segments d’index,
Segments d’annulation (rollback),
Segments temporaires,
Segments d’amorçage (bootstrap).
SEGMENTS DE DONNEES
Les segments de données servent à stocker les données des tables utilisateurs et
système ainsi que celles des tables groupées (cluster).
Chaque table a un et un seul segment qui contient toutes les données de la table. Ce
segment est créé automatiquement lors de la création de la table.
La manière dont les extensions sont allouées dans un segment est précisée à l’aide des
paramètres de stockage explicités lors de la création d’une table ou d’un cluster.
12
Structure logique
Segment
SEGMENTS D’INDEX
Les segments d’index servent à stocker les données d’index séparément des données. Chaque index
est contenu dans un segment distinct. Ce segment est créé automatiquement lors de la création
d’index.
Lors de la création d’index, on peut préciser le tablespace dans lequel sera créé le segment d’index.
Ce tablespace peut être différent (fortement recommandé) de celui du segment de données de la table
associée
SEGMENTS TEMPORAIRES
Les segments temporaires sont utilisés pour effectuer le traitement des commandes SQL nécessitant
un espace disque temporaire (ORDER BY, GROUP BY, SELECT DISTINCT, UNION, MINUS,...).
Si aucun tablespace temporaire n’a été défini, c’est le tablespace SYSTEM qui est utilisé par défaut
(Très mauvais).
SEGMENTS D’AMORCAGE (BOOTSTRAP)
Le segment d’amorçage est créé dans le tablespace SYSTEM au moment de la création d’une base
de données. Il contient les définitions du dictionnaire de données qui sont chargées au moment de
l’ouverture de la base de données.
SEGMENTS D’ANNULATION (ROLLBACK)
Les segments d’annulation (rollback segment) permettent d’enregistrer les actions effectuées par les
transactions. Ils contiennent les données avant modification par les transactions, permettant ainsi
d’annuler leur effet en cas de besoin.
13
4 Structure Physique
Types de fichiers :
Fichiers de données (Data files)
Fichiers de reprise (Redo Log Files)
Fichiers de contrôle (Control files)
14
Structure Physique
(suite)
Fichiers de données
Lors de la création de tablespace le ou les fichiers de données
seront spécifiés :
CREATE TABLESPACE ts_logistique
DATAFILE ‘/usr1/base/fichier1.dbf’ SIZE 1 M,
‘/usr2/base/fichier2.dbf’ SIZE 1 M
DEFAULT STORAGE (INITIAL 100K NEXT 100K
MINEXTENT 1 MAXEXTENT 5 PCTINCREASE 50)
Ces fichiers assurent le stockage des objets créés par les utilisateurs
(tables, clusters, index,...) ainsi que ceux nécessaires au
fonctionnement d’Oracle. Lors de création d’une base de données, il
doit y avoir au moins un fichier pour stocker le dictionnaire de données.
15
Structure Physique
(suite)
Fichiers de reprise
Les fichiers de reprise (Redo log) contiennent les modifications des
données les plus récentes. Ils sont au moins deux et sont utilisés d’une
façon circulaire. S’ils sont deux, par exemple, Oracle enregistre les
modifications dans le premier fichier et, lorsqu’il est plein, il passe au
second. Lorsque les deux fichiers sont pleins, il revient au premier, et
ainsi de suite.
Oracle offre la possibilité d’archiver un fichier de reprise plein avant sa
réutilisation (Archived redo log).
De même, Oracle offre la possibilité de dupliquer le fichier de reprise
pour que les informations de reprise soient écrites simultanément sur
plusieurs fichiers. Le risque de perte de ces informations est ainsi
réduit.
16
Structure Physique
(suite)
Fichiers de contrôle
17
5 Correspondance entre les structures physique et
logique
Segments Do nné es In dex Ro llba ck B oo tstra p T em por aire D onn ées Index
Extensions
Blocs logiques
Blocs physiques
18
6 Architecture fonctionnelle d’un SGBDR
Introduction
Tables Vues
A nalyse
Index Cluster
C orres pondance
Procédure s
G estionnaire de données
SGB DR
BD
19
Architecture fonctionnelle d’un SGBDR
Introduction (suite)
20
Architecture fonctionnelle d’un SGBDR
Introduction (suite)
L’analyseur de requêtes a comme objectif final de fournir donc le chemin
d’accès optimal aux données en transformant la requête SQL en un plan
d’accès aux données. Pour ce faire, après analyse syntaxique, il doit
étudier la correspondance entre les vues externes (vues Utilisateurs =
Requêtes) et la structure conceptuelle/logique (étape de vérification
sémantique) de la base de données, puis étudier la correspondance entre
la structure conceptuelle/logique et la structure physique (interne) de la
base de données.
21
7 Les optimiseurs de requêtes
- Rôle -
L’optimiseur de requêtes constitue la première grande fonction que le SGBDR doit
assurer lors de l’exécution de requêtes en provenance de l’utilisateur (requêtes
interactives ou programme d’application).
Son rôle est déterminant, il doit permettre l’exécution la plus rapide possible de la
requête SQL. Il doit donc fournir d’une part la stratégie optimale d’exécution de la
requête, appelée le plan d’exécution de la requête et libérer d’autre part le
programmeur de la connaissance du fonctionnement des opérateurs SQL
(méfiance quand même ?).
La requête de l’utilisateur sera donc analysée dans le détail et “ brassée ” jusqu’à
l’obtention du meilleur plan pour son exécution, c’est à dire celui qui nécessitera le
moins d’Entrées / Sorties disques, en inspectant les tables système du dictionnaire
de données (DD).
La qualité d’un optimiseur de requêtes est l’un des critères qui permet de juger de
la performance du SGBDR tout entier, aussi bien en terme de temps de réponse
que de charge de travail. En effet, il ne faudrait pas que l’exécution des travaux de
préparation de l’optimiseur soit plus longue que l’exécution de la requête non
optimisée !.
22
Les optimiseurs de requêtes
- Stratégie d’exécution des plans “d’exécution” -
Systèmes compilés :
Certains optimiseurs compilent les plans d’exécution des requêtes afin de pouvoir les réutiliser
par la suite et éviter ainsi de recommencer le travail d’optimisation. Dans ce cas, au moment
de la nouvelle exécution d’une requête dont le plan a déjà été compilé puis sauvegardé,
l’optimiseur vérifie si le plan est toujours valide et, dans ce cas, le plan est exécuté à
nouveau. Cette approche est valable pour les requêtes définies dans des procédures stockées
ou cataloguées.
Systèmes interprétés :
A l’inverse, les systèmes interprétés effectuent une optimisation à chaque exécution de la
requête.
De façon générale, l’interprétation s’avère intéressante dans le cas où :
les requêtes SQL sont ad-hoc, c’est-à-dire non prévues à l’avance ou lorsque les applications
contiennent des ordres SQL dynamiques, c’est-à-dire dans lesquelles les paramètres de la
requêtes sont à saisir par l’utilisateur au moment de l’exécution de la requête. En effet, il y a
alors peu de chance pour que le même plan puisse être exécuté à nouveau, la requête
manipulant généralement des volumes de données différents à chaque fois;
le schéma ou le contenu de la base change fréquemment; dans ce cas, les plans d’exécution
des requêtes seront souvent rendus caducs et la perte de temps lors de la compilation ne
s’avère donc pas justifiée.
23
Les optimiseurs de requêtes
- Stratégie d’exécution des plans “d’exécution” -
Systèmes mixtes :
Certains optimiseurs interprétés sauvegardent quand même des résultats pour les
utiliser ultérieurement (systèmes mixtes). L’optimiseur conserve alors en mémoire
centrale les plans qu’il a exécutés récemment et essaie, lorsqu’une nouvelle requête
arrive, de trouver un plan équivalent. Si cette recherche échoue, du fait d’une requête
plus complexe, il essaie alors de trouver des morceaux de plans qui pourraient être repris
pour composer le plan final de la requête.
24
Les optimiseurs de requêtes
- Modes d’évaluation du coût d’une requête -
Optimisation basée sur les statistiques :
La méthode statistique est disponible dans plusieurs SGBDR du marché. Cette méthode se base sur
des statistiques relatives aux tables pour déterminer le meilleur chemin d’accès. Ces statistiques
concernent le volume des tables (nombre de lignes), le nombre de blocs alloués à la table, le nombre
de valeurs distinctes de chaque colonne, les valeurs minimale et maximale des colonnes, la
distribution de la clé, le nombre de valeurs différentes d’un index.
Ces statistiques sont mises à jour automatiquement (ce qui requiert du temps),
ou à la demande de l’Administrateur de la base de données, ou encore lorsqu’un événement apparaît
(de type “ trigger ” par exemple), par modification des tables système correspondant
Optimisation basée sur les heuristiques :
Le coût d’une requête peut être également obtenu en utilisant des heuristiques, c’est-à-dire un
ensemble des règles permettant de guider l’évaluation.
L’utilisation d’heuristiques fournit un plan contenant la liste classée des opérations à effectuer pour
satisfaire la requête. Cette liste est obtenue par consultation des coûts relatifs de chaque opération.
Cette solution est très intéressante dans le cas où la distribution des données suit les heuristiques, car
elle permet d’éviter l’évaluation des fonctions de coûts.
Par ailleurs, certains optimiseurs utilisent des techniques d’intelligence artificielle et emploient des
heuristiques de nature différente, représentant des règles de savoir-faire. Celles-ci permettent
d’éliminer certains plans jugés trop longs après l’expérience que l’optimiseur possède. En général, ces
règles de savoir-faire sont figées dans le SGBDR.
25
Les optimiseurs de requêtes
- Limites -
Limites de l’optimiseur
Tout optimiseur a des limites qu’il est bon de pouvoir cerner : limites en
nombre maximal de tables manipulées, de jointures, de sous-requêtes
imbriquées.
26
8 Gestion de reprise après incident
Journal des transactions
27
Gestion de reprise après incident
Approches
Deux approches sont envisagées dans le SGBDR commercialisés pour conserver
cet historique :
Journal des transactions physiques
Journal des transactions logiques
Journal des transactions physiques
En partant du principe qu’une opération d’écriture sur une donnée lit un bloc de
données, le modifie et l’écrit, le journal des transactions prend une “ photographie ” du
bloc avant la modification et une photographie du bloc après la modification. Ces
“photographies” sont appelées des Images Avant (Before Image) et les Images Après
(ou After Image). Un tel journal des transactions est dit physique.
28
Gestion de reprise après incident
Nature des pannes
Plusieurs problèmes peuvent arrêter le déroulement normal d’une
opération sur la base de données ou même affecter l’écriture des données
sur le disque.
Certaines pannes ne nécessitent pas d’intervention de l’administrateur, car
le système assure lui-même la restauration dite reprise à chaud. D’autres
pannes sévères nécessitent l’intervention de l’administrateur, qui doit
restaurer la base (reprise à froid) à partir d’une sauvegarde récente.
Exemples de pannes
Erreur accidentelle : suppression de tables ou d’autres objets de la base.
Panne sur une commande SQL : problème d’allocation d’extension ou autres
Panne d’un processus SGBDR : il peut arriver qu’un processus du SGBDR
s’arrête brutalement sans avoir validé ou annulé les transactions en cours.
Panne réseau : une panne réseau peut interrompre l’exécution normale d’une
application cliente et provoquer une panne du processus.
Panne matérielle (disque,…)
29
Cours 5
Raisons économiques :
Coût élevé d’acquisition et de maintenance des ordinateurs “main frame”
Raisons techniques :
Les développements remarquables de domaines :
Réseaux de communication
Mini et micro-ordinateurs
Bases de données relationnelles
Le développement croissant des applications
Multimédias (Données alphanumérique, Texte, Image, Son)
Infocentre (Orienté Utilisateur)
L’offre remarquable des Outils de développement sur PC.
L’exigence des entreprises d’avoir un système évolutif / progressif pour supporter les
besoins de logiciels.
Raisons organisationnelles :
Décentralisation des activités
Délégation du pouvoir
31
2 Définition
Définition :
Une Base de données répartie est un ensemble de bases
de données coopérants, chacune résidant sur un site
différent, vu et manipulé par l’utilisateur comme une seule
base de données centralisée.
===> Transparence à la localisation des données .
32
3 Typologies de systèmes d’informations réparties
Base primaire centrale, mises à jour directes sur site primaire
C’est le cas d’architecture la plus simple, les données de référence (information primaire) sont sur le
site central, les mises à jours sont faites en direct par les utilisateurs sur ce site central (en
client/serveur à travers le réseau) et les données dupliquées sont transportées vers des sites
secondaires utilisés uniquement en consultation par les utilisateurs.
Base primaire centrale, mises à jour indirectes via transaction asynchrones
Même scénario que le premier, mais les mises à jour se font en local sur les sites locaux et grâce à
des procédures asynchrones déclenchées automatiquement que la base primaire centrale sera mise à
jour.
L’utilisateur est alors indépendant de la disponibilité du site central pour faire ses mises à jour.
Multiples bases primaires, base centrale dupliquées pour consolidation
Dans ce cas, plusieurs sites primaires possèdent chacun sa propre base de données et on repercute
dans la base centrale les mises à jour des tables faites en local soit en mode synchrone soit en mode
asynchrone.
Le site central contient donc des tables globales représentant l’union des tables des bases primaires.
En terme du contenu des tables, deux variantes sont possibles :
la base locale ne possède que ses propres données,
la base locale possède ses données ainsi celles des autres sites pour consultation uniquement.
33
4 Conception d’une BD répartie
Nécessité d’une démarche méthodologique
La nécessité de l’utilisation d’une méthode pour concevoir et mettre en oeuvre un système
d’information n’est plus à démontrer.
Cependant lors de conception d’un système d’informations réparties, certains points
deviennent très importants :
Cohérence des traitements de l’Entreprise :
Plus les traitements sont autonomes, et plus le problème de la cohérence se pose. c’est un
véritable enjeu
Propriété des données :
Le problème de la propriété des données va pair de pair avec celui de la cohérence des
traitements :
- Qui peut mettre à jour les données ? Qui en est responsable ? Qui peut y accéder ?
Les performances :
la productivité des utilisateurs locaux doit être optimisée parce qu’ils travaillent avec des données
locales et considèrent que les accès distants sont occasionnels.
La manipulation des seules données affectées, au lieu du remplacement de tables entières, doit
optimiser l’utilisation des réseaux.
La sécurité (fiabilité) :
Les sites locaux doivent mieux résister aux phénomènes de pannes parce qu’ils ne sont plus
tributaires d’une défaillance survenant en n’importe quel point du système
34
5 Techniques utilisées dans la répartition des
données
Technique de fragmentation
Il y a deux façons possibles de diviser une relation en plus petites
relations, horizontalement et verticalement, ce qui donne trois
types de fragments:
Horizontale
Verticale
Mixte
Afin de préserver la cohérence sémantique de la base de données
répartie, la fragmentation d’une relation doit obéir à trois règles :
Décomposition sans perte
Reconstruction
Non duplication
Technique de réplication (duplication)
35
Technique de fragmentation
36
Technique de fragmentation (suite)
Fragmentation verticale (p ) :
La fragmentation verticale définit le partitionnement d’une relation
selon ses attributs.
Les fragments sont obtenus par des projections appliquées sur la
relation initiale.
Il est nécessaire de dupliquer dans chaque fragment le ou les attributs
clés pour pouvoir reconstruire la relation.
La reconstruction est obtenue par la jointure des fragments selon les
attributs communs.
Fragmentation mixte :
La fragmentation mixte combine la fragmentation horizontale et la
fragmentation verticale.
ATTENTION : Le choix de la fragmentation est un problème complexe
car il est dépendant des besoins d’accès des applications
37
Technique de réplication
38
6 Objectifs des SGBD réparties
(12 règles de DATE)
R1- Autonomie locale :
Tout site d’un système réparti doit être aussi autonome que possible. Les
données d’un noeud sont gérés par l’utilisateur qui est sur ce noeud.
L’autonomie des sites est un objectif récent qui permet à chaque site
opérationnel de contrôler et de manipuler ses données locales
indépendamment des autres sites, cependant, la coopération entre sites doit
être coordonnée par les administrateurs locaux.
R2- Pas de couplage fort avec les autres sites :
Pour une meilleure optimisation d’exécution des requêtes et de résistance aux
pannes, chaque site doit viser à privilégier la manipulation par l’utilisateur de sa
base locale, et considère que l’accès à d’autres bases est
occasionnel.
R3- Règles des opérations continues :
On doit pouvoir interrompre un noeud sans interrompre les autres noeuds du
réseau.
39
Objectifs des SGBD réparties
(12 règles de DATE)
R4- Indépendance à la localisation des données :
Le but recherché est que la réorganisation physique de la base de
données répartie, qui peut conduire à transférer des relations d’un site à un
autre, est sans impact sur les programmes d’application qui accèdent à la
BD répartie.
40
Objectifs des SGBD réparties
(12 règles de DATE)
R6- Indépendance à la duplication :
Les avantages escomptés sont :
- une grande disponibilité des données
- une meilleure résistance aux pannes
- un parallélisme dans les consultations
- une diminution du trafic réseau
Les avantages apportés par la duplication sont à comparer avec la complexité et
les coûts supplémentaires de maintenance des copies qui doivent, en théorie,
rester identique à tout moment.
Un compromis entre performance d’accès et cohérence des données à tout instant rend
difficile le choix du niveau de duplication
41
Objectifs des SGBD réparties
(12 règles de DATE)
42
Objectifs des SGBD réparties
(12 règles de DATE)
R8- Gestion de transactions réparties :
Une transaction répartie est constituée de plusieurs sous-transactions,
chacune s’exécutant à un site différent. En général, l’information locale
concernant une sous transaction est insuffisante afin de décider de la
validation ou de l’abandon des mises à jour locales. La seule solution est de
gérer une information globale, ce qui induit un coût de communication et de
traitement supplémentaire.
L’environnement réparti affecte tous les aspects délicats de la gestion de
transactions : contrôle de concurrence, gestion de la fiabilité et traitement de
la validation .
Contrôle de concurrence : Deux approches de base sont utilisées :
Estampillage (Timestamp) et Verrouillage
Gestion de la fiabilité : Adaptation des techniques de journalisation et points
de reprise connues dans l’environnement centralisé.
Validation de transaction : Utilisation du protocole de validation en deux
étapes (Two-Phase Commit).
43
Objectifs des SGBD réparties
(12 règles de DATE)
44
7 Etat de l’art
45
Cours 6
Administration et optimisation
d’une base de données
relationnelle
1 Introduction
4 niveaux d’administration
Niveau logique de la base de données
Niveau physique de la base de données
Niveau applicatif
Niveau système
48
Niveaux d’administration
Niveau logique
49
Niveaux d’administration
Niveau physique
Répartition physique des données;
Dimensionnement de la base de données
détermination des valeurs des paramètres de stockage sur disque (nombre de blocs
initialement alloués aux données ou aux index, nombre de blocs alloués en sus lorsque
l’espace initial est plein, nombre minimal et maximal d’extensions que le système peut
faire, le pourcentage d’espace à conserver libre dans le bloc pour les mise à jour
futures,...)
détermination de la taille de la mémoire cache (cache disque);
détermination des valeurs d’autres paramètres nécessaires au bon fonctionnement
optimal de la Base de données (Nombre de verrous, nombre de curseurs ouverts
simultanément, taille de buffer cache,...)
Détermination du type de fichier physique devant recevoir les données des tables et des
index (File system ou un Raw device si OS= UNIX);
Vérification du bon fonctionnement de la BD
Exécution des Benchmarks
Mise en place de l’environnement Base de données de production, d’intégration et
de développement et de la stratégie de la sauvegarde et la reprise des données
50
Niveaux d’administration
Niveau applicatif
51
Niveaux d’administration
Niveau système
52
3 Optimisation et amélioration des performances
Introduction
Les bonnes ou mauvaises performances d’une base de données relationnelle ne se relèvent pas seulement de la bonne ou
mauvaise définition de sa structure physique.
Il est important de rappeler que, avant de définir la structure physique d’une base de données, une définition de sa structure
logique est obligatoire.
Cette structure logique est la clé, le garant de la bonne définition d’une structure physique de la base de données (cf. cours
Structures logique et physique d’une base de données relationnelle).
Il ne faut surtout pas oublier qu’en terme de modélisation de données, cette structure logique est le fruit d’un long et
fastidieux travail d’analyse et de conception du système d’information à automatiser.
Il est à rappeler aussi, que la finalité d’une base de données est d’être utilisée (exploitée) par des requêtes, des programmes
faisant des recherches (accès en lecture) ou des mises à jour des données dans la base. Ces recherches ou mises à jour
s’effectuent à l’aide des commandes SQL. Si ces dernières sont mal formulées et ne tiennent pas compte des contraintes
imposées par les optimiseurs, les conséquences peuvent être dramatiques en terme des performances du système.
L’expérience prouve que le gain que nous pouvons espérer en améliorant la structure physique d’une base de données
existante (revoir la répartition des fichiers sur plusieurs axes, gérer plus efficacement la mémoire centrale, etc.) est de l’ordre
de 15 à 25 %.
On déduit donc, qu’au moins 75% de gain des performances dépendent fortement de la bonne définition de la structure
logique de la base de données
définir un bon schéma de la base de données : Tables normalisées ou non , Cluster sur tables, Index pour tables, Index pour
Clusters, tablespaces, etc...,
définir les valeurs de paramètres de stockage en fonction de l’évolution des objets dans la base de données dans le
temps,...)
et de la bonne utilisation des commandes SQL dans les programmes applicatifs.
C’est pour cette importante raison que mettons l’accent dans ce chapitre sur l’optimisation des requêtes SQL et sur le choix
des index.
53
Optimisation et amélioration des performances
rappel des méthodes d’accès
Parcours de toute la table (Full Table Scan)
Les donnés sont cherchées directement dans la table. Les blocs qui contiennent les
données de la table sont lus d’une manière séquentielle. Toutes les lignes de la table
sont lues, et, pour chacune d’elles, la condition spécifiée dans la clause WHERE (s’il y en
une) est évaluée.
Accès par ROWID
Les données sont cherchées directement dans la table. Le ROWID spécifie l’adresse
physique de la ligne. Il est composé de l’identifiant du fichier, le bloc dans le fichier et
puis la localisation de la ligne dans le bloc. Ce ROWID est soit cité dans la clause
WHERE, soit obtenu en accédant à l’un des index définis pour la table.
La localisation d’une ligne par son ROWID constitue le moyen le plus rapide pour
retrouver la ligne.
Parcours de l’index (Index Scan)
Cette méthode permet de retrouver les données en se basant sur les valeurs d’une ou
plusieurs colonnes de l’index. Si la commande SQL spécifie seulement des valeurs de
colonnes faisant partie de l’index, Oracle recherche directement les données à partir de
l’index qui servent par la suite à retrouver les lignes elles-mêmes grâce au ROWID.
54
Optimisation et amélioration des performances
rappel des méthodes d’accès (suite)
55
Optimisation et amélioration des performances
performance des méthodes d’accès
Les exemples suivants sont ordonnés selon le degré de performance de la
méthode employée (de plus performant vers le moins performants)
Cas 1 : accès à une seule ligne par ROWID
Disponible si la clause WHERE contient une identification de la ligne par son Rowid
Exemple : SELECT *
FROM Client
WHERE ROWID = ‘xxxxxxxxxxxxx’;
Cas 2 : accès à une seule ligne par jointure des clusters join
Disponible pour une opération de jointure de deux tables stockées dans le même
cluster et les deux conditions sont vérifiées :
1- la clause contient la condition d’égalité entre les deux tables selon la colonne clé
du cluster
2- la clause WHERE contient une condition assurant l’unicité du résultat.
Exemple : SELECT *
FROM Client, Commande
WHERE Client. Code_cli = Commande.Code_cli
AND Date_cde = ‘01-AUG-95’;
56
Optimisation et amélioration des performances
performance des méthodes d’accès (suite)
Cas 3 : jointure clusterisée
Disponible pour une opération de jointure de deux tables et si la
clause WHERE contient des conditions d’égalité entre chaque
colonne de la clé du cluster avec la colonne du cluster
correspondante de l’autre table.
Exemple : SELECT *
FROM Client, Commande
WHERE Client. Code_cli = Commande.Code_cli;
Cas 4 : Clé de cluster indexé
Disponible si la clause WHERE utilise toutes les colonnes de la clé
cluster indexé dans une condition d’égalité. Pour une clé composée
du cluster, les conditions d’égalité doivent être combinées avec des
opérateurs AND. Oracle retrouve la valeur du ROWID avec laquelle
il effectue un accès par cluster.
Exemple : SELECT *
FROM Commande
WHERE Num-cde = ‘AB1234’ ;
57
Optimisation et amélioration des performances
performance des méthodes d’accès (suite)
62
Optimisation et amélioration des performances
Quelques astuces
Abdelkrim LAHLOU
lahloukarim@free.fr
1 - Historique
Emergence de Oracle Corp.
1964 : IBM développe le GUAM pour le projet Apollo (NASA)
1966 : Première BD hiérarchique commerciale du marché d’IBM
1970 : Dr. E. F. Codd d’IBM propose le modèle relationnel
1977 : Larry Ellison, Bob Miner et Ed Oates fondent Oracle
1985 : l’ANSI adopte SQL comme langage de requête standard
1992 : SQL-2
1993 : Sortie d’Access
1995 : Sortie de Postgres95
1996 : Sortie de MySQL
1998 : SQL Server 7 disponible
1999 : SQL-3 et sortie d’Oracle8i
2000 : Sortie d’Oracle 9i
2006 : Oracle 10g 3
2 – Dictionnaire de données
SGBD Oracle
…
5
Noyau Oracle
6
Oracle Data Dictionary
7
Tables du Data Dictionary
Les tables et les vues du Dictionnaire de données donnent
l’information suivante :
les utilisateurs et leurs privilèges
les tables, les colonnes et leurs types, contraintes d’intégrité,
indexes,…
des statistiques sur les tables et indexes
les privilèges donnés sur les objets de la base
les structures de stockage de la base
…
8
Comment savoir ce qu'il y a
dans ma base de données ?
10
Dictionnaire de données Oracle
11
Vues principales du dictionnaire Oracle
12
Quelques commandes utiles
SELECT * FROM DICT[IONARY];
liste toutes les tables et les vues du Data Dictionary accessibles à l’utilisateur
DESC[RIBE] <nom_table>
décrit la structure d’une table
13
3 - Utilitaires de base d’Oracle
Utilitaires d’Oracle
Oracle est un SGBD-R (Relationnel) qui utilise le langage SQL
Il a complété SQL par le langage procédural PL/SQL (langage
propriétaire)
Il fournit de nombreux programmes utilitaires
SQL*PLUS pour faciliter l’utilisation de SQL
SQL*FORMS pour faciliter la saisie et la modification des données
avec des formulaires
SQL*REPORTWRITER pour faciliter l’impression de rapports
imprimés
SQLWEB pour l’interface avec le Web
Oracle HTML-DB (Oracle Application Express)
Oracle Designer
…
15
Les outils d’administration
16
Outils d’Administration
17
Outils d’Administration Oracle
Les principaux outils d’administration d’Oracle :
IOR pour le démarrage et l’arrêt d’un système Oracle
SGI pour le suivi d’un système Oracle
18
Outils d’Administration Oracle
IOR
déclenche un fichier de démarrage (INIT.ORA) qui :
configure le SGA (System Global Area)
19
Outils d’Administration Oracle
20
Outils d’Administration Oracle
21
Outils d’Administration Oracle
22
Qualités du DBA
23
Organisation de la fonction DBA
Dans une grande organisation, une personne seule ne suffit
pas : la fonction DBA revient à un groupe ou cellule
d’administration des données.
La fonction de DBA doit être centralisée et non pas dispersée
pour assurer les responsabilités décrites plus haut.
La fonction de DBA doit être hiérarchiquement
suffisamment élevée pour assurer un rôle stratégique
important. Dans la pratique, elle est rattachée :
au service Etudes de la direction informatique,
à la direction informatique,
à la direction des systèmes d’information.
Le groupe d’administration des bases de données doit
inclure des techniciens très qualifiés et familiers du SGBD
mais aussi des spécialistes de l’organisation et de l’analyse
des systèmes. 24
4 - Quelques objets d’oracle
Objets Oracle
26
Index (1/4)
Définition :
Un index est un objet contenant une entrée pour chaque valeur
apparaissant dans la colonne indexée, qui offre ainsi un accès
direct et rapide aux enregistrements
Objectif :
Amélioration des performances en lecture
Indépendants des tables
Ne modifient pas les requêtes SQL
Basés sur un B-Tree :
On ne peut garder toutes les données dans la RAM.
Les accès disque sont coûteux
Le système passe souvent plus de temps à récupérer les données
qu’à les manipuler (http://www.bluerwhite.org/btree)
27
Index (2/4)
Quand est créé un index ?
Explicitement avec CREATE INDEX
Implicitement :
PRIMARY KEY
UNIQUE
Effet de l’indexation :
La construction de l’arbre ralentit les mises à jour
Mais accélère de manière appréciable les recherches
Il est utile de créer un index sur :
Les attributs utilisés comme critère de jointure
Les attributs utilisés comme critère de sélection
Sur des tables de gros volume où la majorité des interrogations
sélectionnent moins de 5% des lignes (Règle des 5/95)
28
Index (3/4)
Il est inutile de créer un index sur :
Les attributs contenant peu de valeur distincte.
Les attributs souvent modifiés
Les attributs qui sont souvent utilisé dans les expressions
Les petites tables
Ordres SQL :
CREATE [UNIQUE] INDEX <indexName>
ON <table > (<columns>) [ASC / DESC] ;
30
Synonymes
31
Séquences
32
Séquences
33
Les Clusters
34
Les Clusters
Présentation :
Rangement de plusieurs tables selon une condition de jointure.
Optimise les requêtes sur ces tables
Caractéristiques :
Doivent avoir une clé qui définit les lignes qui doivent être
stockées ensemble
Cette clé de cluster peut être composée de plusieurs attributs.
Mécanisme transparent pour l’utilisateur.
Clé de cluster indépendant de la clé primaire
Améliorent les performances en moyenne.
Syntaxe en SQL :
CREATE CLUSTER [schema.] nom_cluster
(colonne type [, colonne type]…)
[autres options]
35
Clusters - Syntaxe
36
Exemple de clusters
Exemple :
CREATE CLUSTER dupont.mon_cluster
(num_spec NUMBER(3)) SIZE 512 HASHKEYS 100;
CREATE TABLE Spectacle
(NumSpec NUMBER(3) PRIMARY KEY,
NomSpec VARCHAR2(20) NOT NULL,
DateDebSpec DATE, DateFinSpec DATE)
CLUSTER dupont.mon_cluster(NomSpec);
CREATE TABLE Representation
(NumRep NUMBER(3) PRIMARY KEY,
NumSpec NUMBER(3) REFERENCES Spectacle(NumSpec),
DateRep DATE)
CLUSTER dupont.mon_cluster(NomSpec);
Suppression cluster :
DROP CLUSTER dupont.moncluster
INCLUDE TABLES;
37
Compte utilisateur
Création d’un utilisateur :
CREATE USER toto
IDENTIFIED BY titi
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
QUOTA 2M ON USERS ;
Modification de mot de passe :
ALTER USER <user>
IDENTIFIED BY <Newpassword> ;
38
5 – SQL-PLUS
39
6 – SQL*Loader
40
Exemple de fichier de données
41
Exemple de fichier de contrôle
42
Exemple de fichier de contrôle
43
Exemple de chargement de données en masse
Clients.ctl - création par SQL*Loader
44
Création de la table Clients sur la base
drop table clients;
45
Procedural Language
for SQL
PL/SQL
1
What is PL/SQL
• PL/SQL is an extension to SQL with design features of
programming languages.
• Data manipulation and query statements of SQL are
included within procedural units of code.
SQL
SQL
Application Other DBMSs
SQL
SQL
SQL
IF...THEN
SQL Oracle with
Application ELSE PL/SQL
SQL
END IF;
SQL 2
Benefits of PL/SQL
Modularize program development
Stored
Anonymous
procedure/
block
DECLARE function
BEGIN Application
Application
procedure/
trigger
function
EXCEPTION
Database
END; Packaged
trigger procedure
3
Benefits of PL/SQL
4
Anatomy of a PL/SQL Block
• DECLARE – Optional
DECLARE
– Variables, constants, cursors, user-
defined exceptions BEGIN
• BEGIN – Mandatory
EXCEPTION
– SQL statements
END;
– PL/SQL control statements
• EXCEPTION – Optional DECLARE
– Actions to perform when v_variable VARCHAR2(5)
errors occur BEGIN
• END; – Mandatory SELECT column_name
INTO v_variable
FROM table_name
END;
5
Declaring PL/SQL Variables
Syntax
identifier [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];
Examples
Declare
v_hiredate DATE;
v_deptno NUMBER(2) NOT NULL := 10;
v_location VARCHAR2(13) := 'Atlanta';
c_ comm CONSTANT NUMBER := 1400;
Assigning
identifier := expr;
v_hiredate := '31-DEC-1998';
6
Base Scalar Datatypes
• VARCHAR2(maximum_length)
• NUMBER [(precision, scale)]
• DATE
• CHAR [(maximum_length)]
• LONG
• LONG RAW
• BOOLEAN
• BINARY_INTEGER
v_job VARCHAR2(9);
v_count BINARY_INTEGER := 0;
v_total_sal NUMBER(9,2) := 0;
v_orderdate DATE := SYSDATE + 7;
c_tax_rate CONSTANT NUMBER(3,2) := 8.25;
v_valid BOOLEAN NOT
7
NULL := TRUE;
The %TYPE Attribute
• Declare a variable according to
– A database column definition.
– Another previously declared variable.
• Prefix %TYPE with
– The database table and column.
– The previously declared variable name.
...
v_ename emp.ename%TYPE;
v_balance NUMBER(7,2);
v_min_balance v_balance%TYPE := 10;
...
8
Commenting Code
• Prefix single-line comments with two
dashes (--).
• Place multi-line comments between the
symbols /* and */.
Example
...
v_sal NUMBER (9,2);
BEGIN
/* Compute the annual salary based on the
v_ename := LOWER(v_ename);
Group functions not available
– The following example is an error
v_total := SUM(number_table);
10
Using Bind Variables
To reference a bind variable in PL/SQL, you must
prefix its name with a colon (:).
Example
:return_code := 0;
IF credit_check_ok(acct_no) THEN
:return_code := 1;
END IF;
RETURN_CODE
-----------
1
11
Interacting with the
Server
SQL Statements in PL/SQL
• Extract a row of data from the database by using the
SELECT command.
• Make changes to rows in the database by using DML
commands.
• Control a transaction with the COMMIT, ROLLBACK, or
SAVEPOINT command.
• Determine DML outcome with implicit cursors.
• PL/SQL does not support
– data definition language (DDL), such as CREATE TABLE,
ALTER TABLE, or DROP TABLE.
– data control language (DCL), such as GRANT or REVOKE.
13
SELECT Statements in PL/SQL
Retrieve data from the database with SELECT.
SELECT select_list
INTO {variable_name[, variable_name]...
| record_name}
FROM table
WHERE condition;
Example
DECLARE
v_deptno NUMBER(2);
v_loc VARCHAR2(15);
BEGIN
SELECT deptno, loc
INTO v_deptno, v_loc
FROM dept
WHERE dname = 'SALES';
...
END; 14
Retrieving Data in PL/SQL
Retrieve the order date and the ship date
for the specified order.
Example
DECLARE
v_orderdate ord.orderdate%TYPE;
v_shipdate ord.shipdate%TYPE;
BEGIN
SELECT orderdate, shipdate
INTO v_orderdate, v_shipdate
FROM ord
WHERE id = 157;
...
END;
15
Retrieving Data in PL/SQL
Return the sum of the salaries for all
employees in the specified department.
Example
DECLARE
v_sum_sal emp.sal%TYPE;
v_deptno NUMBER NOT NULL := 10;
BEGIN
SELECT SUM(sal) -- group function
INTO v_sum_sal
FROM emp
WHERE deptno = v_deptno;
END;
16
Manipulating Data Using PL/SQL
DELETE
17
Inserting Data
18
Updating Data
Increase the salary of all employees in the
emp table who are Analysts.
Example
DECLARE
v_sal_increase emp.sal%TYPE := 2000;
BEGIN
UPDATE emp
SET sal = sal + v_sal_increase
WHERE job = 'ANALYST';
END;
19
Deleting Data
20
Controlling Transactions
Determine the transaction processing for
the following PL/SQL block.
BEGIN
INSERT INTO temp(num_col1, num_col2, char_col)
VALUES (1, 1, 'ROW 1');
SAVEPOINT a;
INSERT INTO temp(num_col1, num_col2, char_col)
VALUES (2, 1, 'ROW 2');
SAVEPOINT b;
INSERT INTO temp(num_col1, num_col2, char_col)
VALUES (3, 3, 'ROW 3');
SAVEPOINT c;
ROLLBACK TO SAVEPOINT b;
COMMIT;
END;
21
Writing Control Structures
Controlling PL/SQL Flow of
Execution
You can change the logical flow of
statements using conditional IF statements
and loop control structures.
• Conditional IF statements:
– IF-THEN
– IF-THEN-ELSE
– IF-THEN-ELSIF
23
IF Statements
Syntax
IF v_ename = 'OSBORNE' THEN
IF condition THEN v_mgr := 22;
statements; END IF;
[ELSIF condition THEN . . .
statements;] IF v_ename = 'MILLER' THEN
v_job := 'SALESMAN';
[ELSE
v_deptno := 35;
statements;] v_new_comm := sal * 0.20;
END IF; END IF;
... . . .
IF v_shipdate - v_orderdate < 5 THEN IF v_start > 100 THEN
v_ship_flag := 'Acceptable'; RETURN (2 * v_start);
ELSE ELSIF v_start >= 50 THEN
v_ship_flag := 'Unacceptable'; RETURN (.5 * v_start);
END IF; ELSE
... RETURN (.1 * v_start);
END IF;
. . .
24
Iterative Control: LOOP
Statements
25
Basic Loop
Syntax
-- delimiter
LOOP
statement1; -- statements
. . . /* EXIT statement, condition
EXIT [WHEN condition]; is a Boolean variable or expression*/
END LOOP; -- delimiter
. . .
v_ordid item.ordid%TYPE := 101;
v_counter NUMBER(2) := 1;
BEGIN
. . .
LOOP
INSERT INTO item(ordid, itemid)
VALUES(v_ordid, v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
. . . 26
FOR Loop
FOR index in [REVERSE] lower_bound..upper_bound LOOP
statement1;
statement2;
. . .
END LOOP;
• Use a FOR loop to shortcut the test for the number of iterations.
• Do not declare the index; it is declared implicitly.
-- Insert the first 10 new line items for order number 101.
. . .
v_ordid item.ordid%TYPE := 101;
BEGIN
. . .
FOR i IN 1..10 LOOP
INSERT INTO item(ordid, itemid)
VALUES(v_ordid, i);
END LOOP;
. . . 27
WHILE Loop
Use WHILE loop to repeat statements while a condition is TRUE.
WHILE condition LOOP
Condition is
statement1;
evaluated at the
statement2;
beginning of
. . .
each iteration.
END LOOP;
Syntax
TYPE type_name IS RECORD
(field_declaration[, field_declaration]…);
31
Creating a PL/SQL Record
32
The %ROWTYPE Attribute
• Declare a variable according to a collection of columns
in a database table or view.
• Prefix %ROWTYPE with the database table.
• Fields in the record take their names and datatypes
from the columns of the table or view.
Examples
Declare a variable to store the same information about a
department as it is stored in the DEPT table.
dept_record dept%ROWTYPE;
Declare a variable to store the same information about a
employee as it is stored in the EMP table.
emp_record emp%ROWTYPE;
33
Writing Cursors
About Cursors
Every executed SQL statement has an individual
cursor associated with it:
• A cursor is a private SQL work area.
• Implicit cursors:
– Declared for all DML and PL/SQL SELECT
statements.
• Explicit cursors:
– Declared and named by the programmer.
– Useful for managing queries that return one or
more rows of data
35
SQL Implicit Cursor Attributes
Using SQL cursor attributes, you can test
the outcome of your SQL statements.
SQL%ROWCOUNT Number of rows affected by the
most recent SQL statement (an
integer value).
SQL%FOUND Boolean attribute that evaluates to
TRUE if the most recent SQL
statement affects one or more rows.
SQL%NOTFOUND Boolean attribute that evaluates to
TRUE if the most recent SQL
statement does not affect any rows.
SQL%ISOPEN Always evaluates to FALSE because
PL/SQL closes implicit cursors
immediately after they are executed.
36
SQL Cursor Attributes
Delete rows that have the specified order
number from the ITEM table. Print the
number of rows deleted.
Example
VARIABLE rows_deleted VARCHAR2(20)
DECLARE
v_ordid NUMBER := 605;
BEGIN
DELETE FROM item
WHERE ordid = v_ordid;
:rows_deleted :=(SQL%ROWCOUNT ||' rows deleted.');
END;
/
PRINT rows_deleted
37
Controlling Explicit Cursors
No
Yes
DECLARE OPEN FETCH EMPTY? CLOSE
Cursor
• Open a Cursor
Fetch a Row from the cursor.
OPEN cursor_name;
Pointer
39
Explicit Cursor Attributes
Obtain status information about a cursor.
Attribute Type Description
%ISOPEN Boolean Evaluates to TRUE if the cursor
is open.
%NOTFOUND Boolean Evaluates to TRUE if the most
recent fetch does not return a row.
%FOUND Boolean Evaluates to TRUE if the most
recent fetch returns a row;
complement of %NOTFOUND
%ROWCOUNT Number Evaluates to the total number of
rows returned so far.
40
Explicit Cursor - example
DECLARE
CURSOR EMP_CUR IS
SELECT empno, ename, sal FROM emp;
CURSOR c1 IS
SELECT empno, ename, job, sal FROM emp
WHERE sal > 2000;
BEGIN
IF NOT emp_cur%ISOPEN THEN -- or run OPEN EMP_CUR;
OPEN emp_cur;
END IF;
LOOP
fetch emp_cur into v_empno, v_ename, v_sal;
EXIT when emp_cur%NOTFOUND;
IF ename_cur%ROWCOUNT > 20 THEN
...
IF (v_sal > 1000) then
DBMS_OUTPUT.put_line(v_empno || ' ' || v_ename || ' ' || v_sal);
ELSE
DBMS_OUTPUT.put_line(v_ename || ' sal is less then 1000');
END IF;
END LOOP;
close emp_cur;
DBMS_OUTPUT.put_line('Execution Complete');
END; 41
Cursors and Records
Process the rows of the active set
conveniently by fetching values into a
PL/SQL RECORD.
Example
...
CURSOR emp_cursor IS
SELECT empno, sal, hiredate, rowid
FROM emp
WHERE deptno = 20;
emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
. . .
FETCH emp_cursor INTO emp_record;
42
Cursor FOR Loops
FOR record_name IN cursor_name LOOP
statement1;
statement2;
. . .
END LOOP;
• Shortcut to process explicit cursors.
• Implicit open, fetch, and close occur.
DECLARE
cursor c1 is
select sal from emp
where job = 'MANAGER';
BEGIN
total_val := 0;
FOR employee_rec in c1
LOOP
total_val := total_val + employee_rec.sal;
END LOOP;
END;
43
Handling Exceptions
Handling Exceptions with PL/SQL
• What is an exception?
– Identifier in PL/SQL that is raised during
execution.
• How is it raised?
– An Oracle error occurs.
– You raise it explicitly.
• How do you handle it?
– Trap it with a handler.
– Propagate it to the calling environment.
45
Handling Exceptions
BEGIN BEGIN
Exception Exception
is raised is raised
EXCEPTION EXCEPTION
Exception Exception is
is trapped END; END; not trapped
Exception
propagates to calling
environment
46
Trapping Exceptions
Syntax
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
statement1;
statement2;
. . .]
[WHEN OTHERS THEN
statement1;
statement2;
. . .]
47
Declaring Exception
DECLARE exception_name EXCEPTION;
• Exception Types
– Predefined – Implicitly raised
– NO_DATA_FOUND
– TOO_MANY_ROWS
– INVALID_CURSOR
– ZERO_DIVIDE
–. . .
– User-defined – Explicitly raised
48
Predefined Exception
49
User-Defined Exception
• Each exception has an error code (default is 1) and a error
message (default is "User-defined exception"), unless using
the EXCEPTION_INIT pragma exception_name
[DECLARE]
e_products_remainingEXCEPTION;
PRAGMA EXCEPTION_INIT (e_products_remaining, -22292);
. . .
BEGIN
. . . error_number
RAISE e_products_remaining;
...
EXCEPTION
WHEN e_products_remaining THEN
DBMS_OUTPUT.PUT_LINE ('Product code specified is not valid.');
. . .
END;
...
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE;
SQLCODE
v_error_message := SQLERRM;
SQLERRM
INSERT INTO errors VALUES(v_error_code, v_error_message);
END; 51
Creating Procedures
Overview of Procedures
• A procedure is a named PL/SQL block that performs an
action.
• A procedure can be stored in the database, as a database
object, for repeated execution.
Syntax
CREATE [OR REPLACE] PROCEDURE procedure_name
(argument1 [mode] datatype1,
argument2 [mode] datatype2,
. . .
IS [AS]
PL/SQL Block;
54
OUT Parameters: Example
Calling environment QUERY_EMP procedure
7654 v_id
MARTIN v_name
1250 v_salary
1400 v_ comm
56
IN OUT Parameters
Calling environment FORMAT_PHONE procedure
57
Invoking FORMAT_PHONE
from SQL*Plus
SQL>VARIABLE g_phone_no varchar2(15)
G_PHONE_NO
---------------
(800)633-0575
58
Invoking a Procedure from
• From an Anonymous PL/SQL Block
DECLARE
v_id NUMBER := 7900;
BEGIN
raise_salary(v_id); --invoke procedure
COMMIT;
...
END;
62
Executing Functions in
SQL*Plus: Example
Calling environment GET_SAL function
7934 v_id
RETURN v_salary
(DECLARE) (DECLARE)
BEGIN BEGIN
EXCEPTION EXCEPTION
END; END;
Procedure Function
Execute as a PL/SQL statement Invoke as part of an expression
No RETURN datatype Must contain a RETURN datatype
Must return a value
Can return one or more values
64
Creating Packages
Overview of Packages
• Group logically related PL/SQL types, items, and
subprograms
• Advantages
– Modularity
– Information hiding
– Added functionality
67
Example
CREATE OR REPLACE PACKAGE time_pkg IS
FUNCTION GetTimestamp RETURN DATE;
PROCEDURE ResetTimestamp;
END time_pkg;
68
Public and Private Constructs
COMM_PACKAGE package
Package G_COMM 1
specification RESET_COMM 2
procedure declaration
VALIDATE_COMM
function definition 3
Package
body
RESET_COMM
procedure definition 2
69
Creating a Package Body:
Example
SQL>CREATE OR REPLACE PACKAGE BODY comm_package IS
2 FUNCTION validate_comm
3 (v_comm IN NUMBER) RETURN BOOLEAN
4 IS
5 v_max_comm NUMBER;
6 BEGIN
7 SELECT MAX(comm)
8 INTO v_max_comm
9 FROM emp;
10 IF v_comm > v_max_comm THEN RETURN(FALSE);
11 ELSE RETURN(TRUE);
12 END IF;
13 END validate_comm;
14 END comm_package;
15 /
70
Creating a Package Body:
Example
SQL> PROCEDURE reset_comm
2 (v_comm IN NUMBER)
3 IS
4 v_valid BOOLEAN;
5 BEGIN
6 v_valid := validate_comm(v_comm);
7 IF v_valid = TRUE THEN
8 g_comm := v_comm;
9 ELSE
10 RAISE_APPLICATION_ERROR
11 (-20210,'Invalid commission');
12 END IF;
13 END reset_comm;
14 END comm_package;
15 /
71
Invoking Package Constructs
The elements declared in the specification are referenced
from the calling application via dot notation:
package_name.package_element
For example,
DBMS_OUTPUT.PUT_LINE('This is parameter data');
74
Creating Triggers
• Trigger timing:
– BEFORE: The code in the trigger body will execute before the
triggering DML event.
– AFTER: The code in the trigger body will execute after the
triggering DML event.
• Triggering event: INSERT or UPDATE or DELETE
• Table name: On table
• Trigger type:
– Statement: The trigger body executes once for the triggering event.
This is the default.
– Row: The trigger body executes once for each row affected by the
triggering
• Trigger body: [DECLARE]
BEGIN
[EXCEPTIONS]
END 75
Statement and Row Triggers
Example 1
Example 2
77
Before Statement Trigger:
Example
SQL> CREATE OR REPLACE TRIGGER secure_emp
2 BEFORE INSERT ON emp
3 BEGIN
4 IF (TO_CHAR (sysdate,'DY') IN ('SAT','SUN'))
5 OR (TO_CHAR(sysdate,'HH24')NOT BETWEEN
6 '08' AND '18'
7 THEN RAISE_APPLICATION_ERROR (-20500,
8 'You may only insert into EMP during normal
9 hours.');
10 END IF;
11 END;
12 /
78
Example
79
Using Conditional Predicates
SQL>CREATE OR REPLACE TRIGGER secure_emp
2 BEFORE INSERT OR UPDATE OR DELETE ON emp
3 BEGIN
4 IF (TO_CHAR (sysdate,'DY') IN ('SAT','SUN')) OR
5 (TO_CHAR (sysdate, 'HH24') NOT BETWEEN '08' AND '18') THEN
6 IF DELETING THEN
7 RAISE_APPLICATION_ERROR (-20502,
8 'You may only delete from EMP during normal hours.');
9 ELSIF INSERTING THEN
10 RAISE_APPLICATION_ERROR (-20500,
11 'You may only insert into EMP during normal hours.');
12 ELSIF UPDATING ('SAL') THEN
13 RAISE_APPLICATION_ERROR (-20503,
14 'You may only update SAL during normal hours.');
15 ELSE
16 RAISE_APPLICATION_ERROR (-20504,
17 'You may only update EMP during normal hours.');
18 END IF;
19 END IF;
20 END;
21 /
80
After statement Trigger: Example
CREATE OR REPLACE TRIGGER emp_log_t
AFTER INSERT OR UPDATE OR DELETE ON emp
DECLARE
dmltype CHAR(1);
BEGIN
IF INSERTING THEN
dmltype := 'I';
INSERT INTO emp_log (who, operation, timestamp)
VALUES (USER, dmltype, SYSDATE);
ELSIF UPDATING THEN
dmltype := 'U';
INSERT INTO emp_log (who, operation, timestamp)
VALUES (USER, dmltype, SYSDATE);
ELSIF DELETING THEN
dmltype := 'D';
INSERT INTO emp_log (who, operation, timestamp)
VALUES (USER, dmltype, SYSDATE);
END IF;
END;
81
After Row Trigger: Example
CREATE OR REPLACE TRIGGER emp_log_t
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW
DECLARE
dmltype CHAR(1);
BEGIN
IF INSERTING THEN
dmltype := 'I';
INSERT INTO emp_log (who, operation, timestamp)
VALUES (USER, dmltype, SYSDATE);
ELSIF UPDATING THEN
dmltype := 'U';
INSERT INTO emp_log (who, operation, timestamp)
VALUES (USER, dmltype, SYSDATE);
ELSIF DELETING THEN
dmltype := 'D';
INSERT INTO emp_log (who, operation, timestamp)
VALUES (USER, dmltype, SYSDATE);
END IF;
END;
82
Special Variables :old and :new
• FOR EACH ROW clause:
• A Statement level trigger fires only once for the triggering event. No
access to the column.
• A Row-Level trigger fires for each affected row. Can access the original
and new column.
83
After Row Trigger: Example
CREATE OR REPLACE TRIGGER emp_log_t
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW
DECLARE
dmltype CHAR(1);
BEGIN
IF INSERTING THEN
dmltype := 'I';
INSERT INTO emp_log (who, operation, timestamp, emp_no)
VALUES (USER, dmltype, SYSDATE, :new.empno);
ELSIF UPDATING THEN
dmltype := 'U';
INSERT INTO emp_log (who, operation, timestamp, emp_no)
VALUES (USER, dmltype, SYSDATE, :new.empno);
ELSIF DELETING THEN
dmltype := 'D';
INSERT INTO emp_log (who, operation, timestamp, emp_no)
VALUES (USER, dmltype, SYSDATE, :old.empno);
END IF;
END;
84
Using Old and New Qualifiers
85
User Audit_Emp_Values Table
USER_NAME TIMESTAMP ID OLD_LAST_NAME NEW_LAST_NAME
EGRAVINA 12-NOV-97 7950 NULL HUTTON
Continuation
OLD_TITLE NEW_TITLE OLD_SALARY NEW_SALARY
NULL ANALYST NULL 3500
86
Restricting a Row Trigger
SQL>CREATE OR REPLACE TRIGGER derive_commission_pct
2 BEFORE INSERT OR UPDATE OF sal ON emp
3 FOR EACH ROW
4 W
WHEN (new.job = 'SALESMAN')
5 BEGIN
6 IF INSERTING THEN :new.comm := 0;
7 ELSE /* UPDATE of salary */
8 IF :old.comm IS NULL THEN
9 :new.comm :=0;
10 ELSE
11 :new.comm := :old.comm * (:new.sal/:old.sal);
12 END IF;
13 END IF;
14 END;
15 /
87
Managing Triggers
Disable or Re-enable a database trigger
ALTER TRIGGER trigger_name DISABLE | ENABLE
88
Summary
Procedure Package Trigger
xxxxxxxxxxxxxxxxxx
vvvvvvvvvvvvvvvvvv
xxxxxxxxxxxxxxxxxx
vvvvvvvvvvvvvvvvvv
xxxxxxxxxxxxxxxxxx
vvvvvvvvvvvvvvvvvv
Procedure A
xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxx
declaration
vvvvvvvvvvvvvvvvvv
xxxxxxxxxxxxxxxxxx
vvvvvvvvvvvvvvvvvv
xxxxxxxxxxxxxxxxxx
vvvvvvvvvvvvvvvvvv
xxxxxxxxxxxxxxxxxx
Procedure B
definition
Procedure A
definition
Local
variable
89