---
# System prepended metadata

title: Base de donnée

---

# Base de donnée 
## Cours Index
Définition : structure de données avec en entrée une propriété (search key), et qui permet de retrouver rapidement les enregistrements possédant cette propriété
### Organisation logique : bloc/extend/segement/tablespace
- Un espace de table est une agrégation de segments
- un segment est une agrégation d'extention 
- Une extention est une agrégation de bloc

Dans chaque bloc on à une portion qui est vide (pctfree) pour la gestion des maj.

## TP Transaction 
**rollback** annule la dernière action réalisée.
**Commit** valide la transaction contrairement au rollback
**Le commit** se fait avant et après le **creat**.
En mode en **serializable** on ne voit pas les modif mm après un **commit**
En mode en **read-uncommitted** on ne voit  les modif mm sans  un **commit**

**V$LOCKED_OBJECT** répertorie tous les verrous acquis par chaque transaction sur le système. Il montre quelles sessions détiennent des verrous DML (c'est-à-dire des files d'attente de type TM) sur quels objets et dans quel mode.
#### Erreur create
Lorsqu'on réalise un create et que cette instruction comporte une/erreur alors : 
- Cette erreur peut etre de haut niveau dans ce cas **aucun des commit n'est effectué**
- Cette erreur peut etre de bas niveau dans ce cas **seul le premier commit est effectué**. Les données sont inséré

## TP optimisation 

projecttion = selection sur les coloenne 
π σ ⋉ ⋊ ⋈
π = projection  ( select )
σ  = collection ( where )
⋈ = jointure 
On peut commencer par   ou , cela ne change rien fausse pour l optimisation ( tout ce qui est dans projection doit etre dans la selection )


explaint for : affiche le plan d execution 
table access full : accès  total à la table  
 
right semi jointure sql :  ⋊ 
semi joinure = on l utilise lorsqu'on retourne  que les att d'une seule table
sigma = select
pi = select 
 salection * = selection de ligne et colonne 
 la selection est toujours à la fin

> Note liée au révision de l'ue BDD


SORT JOIN : permt de trier pour ouvoir la fusion , 
	premiere etape : faire un tri 


4. Combien de blocs de données sont parcourus au total ?
 3541 consistent gets ( qui sont en mémoire vivre  qui sont dans le cache de donée v$cache) 
	
3430 physical reads   
bd block gets : blog qui sont pas forcement dans l etat actuel 

tri fusion 
nestedloop : boucle imbriqué


3. Est ce que le serveur est allé lire des blocs de données, en mémoire secondaire, pour satisfaire
le calcul de la requête ?
oui car on vu dans les stat que eu des bloc de donnée lu dans le disque 

3. Est ce que le serveur est allé lire des blocs de données, en mémoire secondaire, pour satisfaire
le calcul de la requête ?

n peu moins de 7 mille 


5. Est ce qu’il y a une différence, et de combien, entre le nombre de tuples réellement retournés
par la requête et le nombre de tuples estimés ?
y'a une diffent de plus de 100 tuple 536 - 


6. La requête correspond à une semi-jointure. Donnez en deux écritures SQL équivalentes.
- Version 1 
select  codeinsee, val_population from population p
where   annee = 2010 and codeinsee in (
select codeinsess from commune where NUMDEP = '34'
);

- Version 2
select  codeinsee, val_population from population p
where  and annee = 2010 and exists  (
select * from commune  c where num dep = '34 and c.codeinsee = p.codeinsee
);
-- mm plant d execution pour ces deux requestes équivalentes 

-- exercice 2

1. Quel est le rôle d’un index ? Quelle est la structure d’index la plus exploitée dans les SGBDR ?

on a fait qu'une structure  c'est les arbre tree
on accède au tuple via les id
le role c daméliorer et acc la recher l ecces au tuple dans le  bloc 
du coup les requeste serons bq plus efficaces
arbre équilibré ou btree qui offre le meilleur de compris pour l acces au donnée( consilation insertuon supprion )

2. Vous expliquerez l’ordre suivant :
set verify off
select index_name from dba_indexes where upper(table_name) = upper(&matable);

-- pour un user donné 
select index_name from dba_indexes where upper(table_name) = upper(&matable) and upper(owner) = upper(&owner)


Vous disposez d’une table EMP qui comporte un attribut NUM sur lequel est posé une contrainte
de clé primaire.
(a) EMP se voit appliquer un index unique ? (justifier votre réponse)
index unique sur num de mm nom  que la contrainte de clé primaire  et de type b+Tree


(b) Des requêtes de consultation vous sont données. Lesquelles vont bénéficier de l’index ?
i. select num from emp ;
oui dense donc toutes les valeurs de num contenues  dans l'index et seul l index esr nécessaure pour la consulation
ii. select nom from emp where num = 20 ;
oui car index unique - cas type ou l index va etre utilisé et va etre très efficace pour le retour d'un seul tuple
iii. select nom, fonction from emp ;
non car on va chercher d autre infos et de plus on fait un parcour complet sur la table comme si on avaias pas d index 
iv. select nom from emp where num > 10 ;
oui car on fait une selection avec un filtrage sur num 
oui recherche par intervalle sur num - b+Tree très efficace pour la recherche par intervalle 



il aura pas d exo sur la surcouche procedurale

exercice 5
 
2. Comment connaı̂tre le nom de l’espace de table dans lequel les tables de votre schéma utilisateur
sont organisées ? idem pour les index ?
desc sur la table user_table  et voir un attribut qui s appel atble_space_name et 


4. Comment savoir à quel fichier de données correspond un espace de table ?

ça correspond à quelque chose qui ressemble bda_data_face


Quel est le paquetage qui vous renseigne sur le bloc de données qui contient un tuple précis
d’une table en particulier ?
dbms_rowid
user = pour l user qui execute la request
cpu temps de calcule 
l autre temps de resultat


## TD-Transaction 

### Vue V$lock
**V$LOCK** répertorie les verrous actuellement détenus par la base de données Oracle et les demandes de verrou ou de verrou en attente.
L'attribut block prend la valeur 1, lorsque la session détient un verrou qui est en train
de bloquer une autre transation (et 0 dans le as ontraire). L'attribut lmode indique le type de verrou détenu par la transation et son domaine de valeurs est détaillé plus bas. L'attribut lmode peut aussi indiquer (pour la transation en attente) le type de verrou demandé, mais non encore obtenu :

- 3 : Row Exlusive : posé de manière automatique avec tout ordre update, delete et insert.
- 6 : Exlusive : une seule transation est autorisée à poser un verrou exlusif sur une table, les autres transations doivent alors se contenter de simples letures de la table.
    
L'attribut type permet aussi de caratériser le verrou mobilisé, et a pour domaine de valeurs (non
exhaustif) :
1. TM : DML enqueue (verrou assoié à un ordre DML sur la table)
2. TX : Transation (verrou au niveau du tuple)
3. TD : DDL enqueue (verrou assoié à un ordre DDL sur la table)
4. TS : Temporary Segment

Quelque Test sur V$lock :

USER1 lance une requête UPDATE pour mettre à jour une ligne sur une table dans son schema sans effectuer de COMMIT.
Une nouvelle ligne (c.à.d un nouveau verrou) est ajoutées automatiquement dans la vue V$lock avec comme :
    Type : TM
    Lmode : 3

USER2 lance aussi une requête UPDATE pour essayer de mettre à jour la même ligne et celui-ci,il se retrouve bloqué.
Une nouvelle ligne est de lors insérée dans la vue V$lock avec comme :
    Type : TX
    Lmode : 6
    
#### Partie 2.3.3 : Qui bloque quoi?

```sql
select oracle_username, os_user_name, locked_mode,
object_name, object_type from v$locked_object a,dba_objects b
where a.object_id = b.object_id;
```
Cette requête affiche les informations sur les verroues détenus, les objets concernés et les utilisateurs qui les detiennent.
locked_mode : le mode de verrou (même valeur que la colonne "lmode" de la vue v$lock).
#### 2.3.4 Qui se trouve en situtation d'attente ?
select distinct s.username ,s.sid,w.seconds_in_wait  as n_seconds , w.WAIT_TIME
from v$session s, v$session_wait w
where s.sid = w.sid ;

V$SESSION_WAIT :  affiche la dernière attente en cours ou en cours pour chaque session.

WAIT_TIME : 
Si la session est actuellement en attente, la valeur est 0. Si la session n'est pas en attente, la valeur est la suivante:

>0 - La valeur est la durée de la dernière attente en centièmes de seconde

-1 - La durée de la dernière attente était inférieure à un centième de seconde

-2 - Le paramètre TIMED_STATISTICS a été défini sur false

SECONDS_IN_WAIT : 
Si la session est actuellement en attente, la valeur correspond au temps d'attente de l'attente en cours. Si la session n'est pas en attente, la valeur correspond au temps écoulé depuis le début de la dernière attente.
Cette colonne est obsolète au profit des colonnes WAIT_TIME_MICROet TIME_SINCE_LAST_WAIT_MICRO.

#### 2.3.5 Qui a posé des verrous bloquants ?)

select sid,username from V$SESSION where sid in
(select sid from V$LOCK where block=1);

Cette requête permet d'afficher les noms des utilisateurs et les identifiants de leurs sessions qui ont posé des verrous et qui sont bloquants pour d'autres sessions.
#### 2.3.6 Qui bloque qui ?

#### 2.3.7 Procédure PL/SQL

#### 2.3.8 Modes d'isolation

Quels sont les modes d'isolation à même de prévenir les lectures non répétables 

sont : le mode repeatable read et serializable.
1. quand la transaction ne fait que des opérations en lecture sur les données.

2. quand la transaction fait aussi des acès en écriture sur les données.

