H - Corrigés

Corrigé - Flashback QUERY : Retour vers le futur

1) SQL> show parameter UNDO

NAME TYPE VALUE
undo_management string MANUEL
undo_retention integer 14400
undo_tablespace string UNDO

SQL> — retention a 10 min
SQL> ALTER SYSTEM SET UNDO_RETENTION=600 SCOPE=MEMORY
SQL> ALTER SYSTEM SET UNDO_MANAGEMENT=AUTO SCOPE=MEMORY

ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified

C’est normal c’est un paramètre statique !
On va donc modifier le SPFILE et arrêter / redémarrer la base…

SQL> CONNECT SYS AS SYSDBA
SQL> ALTER SYSTEM SET UNDO_MANAGEMENT=AUTO SCOPE=SPFILE
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP

On va donner le droit qui va bien à SCOTT pour faire du FLASHBACK :

SQL> Connect system (pas la peine d’être SYS…
SQL> grant flashback on scott.emp to scott

2) — on supprime la ligne (ca c’est pas compliqué…)

SQL> SELECT count(*) FROM emp;
14
SQL> DELETE FROM emp
WHERE ename=’KING’
1 row deleted
SQL> COMMIT
Commit complete
SQL> SELECT count(*) FROM emp;
13

3) — vérificatiuon de  la table il y a 2 minutes (avant suppression de KING)

SQL> SELECT * FROM emp
AS OF timestamp(sysdate - 2/1440);
– réinsertion de KING
SQL> INSERT INTO emp
SELECT * FROM emp
AS OF timestamp(sysdate - 2/1440)
WHERE ENAME=’KING’;
SQL> COMMIT

CQF(D)D !

corrigé - flashback table

Recupération de table grace à la recovery Area

——————————————————
Vérifier que la poubelle est active au niveau instance
et l’activer si nécessaire
SQL> SHOW PARAMETER recycle
SQL> ALTER SYSTEM SET recyclebin= ON;
——————————————————————
Creer une table T1 avec une colonne CHAR, inserer une ou 2 lignes
Creer deux tables T2 et T3 avec une colonne INTEGER
Supprimer la table T1 et T2 logiquement
Supprimer la table T3  physiquement

create table t1 (c char(10));
create table t2 (n integer);
create table t3 (n integer);
drop table t1;
drop table t2;
drop table t3 purge;

———————————-
Vérifier le contenu de la poubelle
SQL> SHOW recyclebin

———————
Récuperer la table T1
SQL> FLASHBACK TABLE T2 TO BEFORE DROP;

———————————–
Purger si nécessaire la corbeille
SQL> PURGE recyclebin;

 

gestion des statistiques

Vérification des statistiques collectées pour HR :

SQL> select table_name, last_analyzed
  2  from user_tables;
TABLE_NAME		       LAST_ANAL
------------------------------ ---------
REGIONS 		       13-MAY-11
LOCATIONS		       13-MAY-11
JOBS			       13-MAY-11
EMPLOYEES		       13-MAY-11
JOB_HISTORY		       13-MAY-11
COUNTRIES		       13-MAY-11
DEPARTMENTS		       13-MAY-11

Nous sommes le 30 le Job a l’air un peu ancien…

Vérification de la collecte automatique des statistiques à la console :

SERVEUR > Oracle Scheduler > Tache de maintenance automatisée.

Vérification de la date de création de la base :

SQL> select name, created
  2  from v$database;
NAME	  CREATED
--------- ---------
DD	  13-MAY-11

CQFD

Gestion des Users et des Roles - 1

Gestion des Users et des role 1

A l’aide la console EM
- creer un utilisateur USERn
avec les caractéristiques suivantes :
Espace disque logique par defaut TBSn, TBS temporaire TEMP, quota sur TBSn 50K
et les privileges minimum pour pouvoir créer des tables
- verifier la possibilité de création d’une table et les caractéristiques son implantation
en creant une table sous i*SQLPLUS
: CREATE TABLE nom_table (nom_col type , nom_col type, …)

Pour la suite des TPs donner le role DBA a USERn

Optimisation grace aux vues matérialisées

1) creer si necessaire le schema SH avec les scripts fournis

sous SQL+ lancer la requete suivante

SQL> SELECT p.prod_subcategory, t.calendar_month_desc, c.cust_city,
       SUM(s.amount_sold) AS sum_amount_sold,
       COUNT(s.amount_sold) AS count_amount_sold
FROM   sales s, products p, times t, customers c
WHERE  s.time_id=t.time_id
AND    s.prod_id=p.prod_id
AND    s.cust_id=c.cust_id
and t.calendar_year=1999
and country_id='US'
GROUP BY p.prod_subcategory, t.calendar_month_desc, c.cust_city;

2) Que fait elle ?
Verifier son temps d'execution : 

SQL> SET TIMING ON
...
...
...
22016 rows selected.
Elapsed: 00:00:05.62

3) afficher le PLAN d'execution

SQL> set linesize 160
SQL> select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 790960488

------------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |           |   360K|    28M|       |  9096   (2)| 00:01:50 |       |       |
|   1 |  HASH GROUP BY               |           |   360K|    28M|    31M|  9096   (2)| 00:01:50 |       |       |
|*  2 |   HASH JOIN                  |           |   360K|    28M|       |  2119   (3)| 00:00:26 |       |       |
|   3 |    TABLE ACCESS FULL         | PRODUCTS  | 10000 |   224K|       |    61   (0)| 00:00:01 |       |       |
|*  4 |    HASH JOIN                 |           |   360K|    20M|  1016K|  2054   (3)| 00:00:25 |       |       |
|*  5 |     TABLE ACCESS FULL        | CUSTOMERS | 34445 |   605K|       |   183   (5)| 00:00:03 |       |       |
|*  6 |     HASH JOIN                |           |   360K|    14M|       |   893   (5)| 00:00:11 |       |       |
|*  7 |      TABLE ACCESS FULL       | TIMES     |   365 |  7300 |       |     9   (0)| 00:00:01 |       |       |
|   8 |      PARTITION RANGE SUBQUERY|           |  1016K|    21M|       |   874   (4)| 00:00:11 |KEY(SQ)|KEY(SQ)|
|   9 |       TABLE ACCESS FULL      | SALES     |  1016K|    21M|       |   874   (4)| 00:00:11 |KEY(SQ)|KEY(SQ)|
------------------------------------------------------------------------------------------------------------------

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("S"."PROD_ID"="P"."PROD_ID")
   4 - access("S"."CUST_ID"="C"."CUST_ID")
   5 - filter("COUNTRY_ID"='US')
   6 - access("S"."TIME_ID"="T"."TIME_ID")
   7 - filter("T"."CALENDAR_YEAR"=1999)

4) creer une VM correspondante

SQL> CREATE MATERIALIZED VIEW MV_VENTES1
AS SELECT p.prod_subcategory, t.calendar_month_desc, c.cust_city,
       SUM(s.amount_sold) AS sum_amount_sold,
       COUNT(s.amount_sold) AS count_amount_sold
FROM   sales s, products p, times t, customers c
WHERE  s.time_id=t.time_id
AND    s.prod_id=p.prod_id
AND    s.cust_id=c.cust_id
and t.calendar_year=1999
and country_id='US'
GROUP BY p.prod_subcategory, t.calendar_month_desc, c.cust_city;

5) Verifier le temps d'execution sur la VM

SQL> explain plan for
  2  select * from mv_ventes1;
Explained.

SQL>
SQL> select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1210413503

-----------------------------------------------------------------------------------
| Id  | Operation            | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |            | 18830 |  1397K|    30   (4)| 00:00:01 |
|   1 |  MAT_VIEW ACCESS FULL| MV_VENTES1 | 18830 |  1397K|    30   (4)| 00:00:01 |
-----------------------------------------------------------------------------------

6) verifier si le QUERY REWRITE est actif sur la base

SQL>  show parameter query

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled                string      TRUE
query_rewrite_integrity              string      enforced

7) créer une nouvelle VM comme la precedente mais avec l'option QUERY REWRITE

 8) re tester le SELECT de depart...

SQL> explain plan for
  2  SELECT p.prod_subcategory, t.calendar_month_desc, c.cust_city,
  3         SUM(s.amount_sold) AS sum_amount_sold,
  4         COUNT(s.amount_sold) AS count_amount_sold
  5  FROM   sales s, products p, times t, customers c
  6  WHERE  s.time_id=t.time_id
  7  AND    s.prod_id=p.prod_id
  8  AND    s.cust_id=c.cust_id
  9  and t.calendar_year=1999
 10  and country_id='US'
 11  GROUP BY p.prod_subcategory, t.calendar_month_desc, c.cust_city;

Explained.

SQL> select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3325364141

-------------------------------------------------------------------------------------------
| Id  | Operation                    | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |            | 25025 |  1857K|    30   (4)| 00:00:01 |
|   1 |  MAT_VIEW REWRITE ACCESS FULL| VM_VENTES2 | 25025 |  1857K|    30   (4)| 00:00:01 |
-------------------------------------------------------------------------------------------

Tablespace et stockage

Evolution des TBS
——————
Visualisez les infos sur le TBS ‘USERS’
Quel taille fait il? Quel est son pourcentage de remplissage actuel ?
Quelles sont ses règles d’extension ? (méthode auto ou non, taille de l’extension, limite…)

onglet ‘Administration’, rubrique ‘Stockage’, lien ‘espace disque logique’,
choisissez ‘USERS’ puis ‘Visualiser’.
Cliquez ensuite sur le lien ‘users01.dbf’ (le 1er et unique fichier qui comose ce TBS)
Vous obtenez des informations de ce style :

Nom /oracle/DBADE/users01.dbf
Espace disque logique USERS
Statut En ligne
Taille de fichier (Ko) 5120
AutoExtend Oui
Incrément 1280Ko
Taille de fichier maximale 32767Mo

Stockage des segments
———————
- comment sont stockés physiquement les objets du tablespace USERS,
combien d’extents et de quelle taille ?

Meme chemin que précédemment.
Quand vous êtes sur la pages ‘Visualiser Espace disque logique : USERS’
Executez ‘Afficher le contenu des espaces disque logiques’
Vous obtenez des informations de ce style :

Nom du segment Type Taille Ensembles de blocs contigus (les extents!)
————– —– —— —————————
SCOTT.PK_DEPT INDEX 64 1
SCOTT.DEPT TABLE 64 1
SCOTT.EMP TABLE 64 1
SCOTT.PK_EMP INDEX 64 1
SCOTT.BONUS TABLE 64 1
SCOTT.SALGRADE TABLE 64 1

Création (pseudo) manuelle de TBS
———————————

SOUS i*SPLPLUS !!!! :
créez un TBS ‘TBSn’ permanent, géré localement,
de 50K, auto extensible jusqu’a 150K par paquet de 50K.
Vous pouvez le cas échéant vous aider de la console pour afficher l’ordre SQL qui va bien…

Sur la console;
… Espace disque logiue, ‘creez’, entrez le nom , ajoutez un fichier de données
puis ‘Afficher le SQL’

CREATE SMALLFILE TABLESPACE “TBS1″
DATAFILE ‘/oracle/DBADE/tbs11.dbf’
SIZE 50K AUTOEXTEND ON NEXT 50K MAXSIZE 150K LOGGING EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO