Exadata sqlplus

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Procédure de test / validation
Contexte Vérification du Storage Index et du Smart Scan via SQL*Plus
Voir aussi Archi exadata · Cellcli

Cette page décrit un protocole de test SQL*Plus permettant de constater, chiffres à l'appui, le gain apporté par le Storage Index et le Smart Scan d'Exadata (voir Archi exadata pour les principes) : on compare le volume d'I/O et le temps de réponse d'une même requête avec et sans ces optimisations.

Préparation d'un jeu de test

Création d'un schéma de test et d'une table volumineuse (~10 millions de lignes) pour avoir suffisamment de données à scanner :

SQL> create user testidx identified by <mot_de_passe>;
SQL> grant dba to testidx;
SQL> conn testidx/<mot_de_passe>
SQL> alter session set sort_area_size=1073741824;
SQL> alter session set workarea_size_policy=manual;
SQL> create table oracledba_emp1 as
     select rownum t1, rownum+1 t2, 'testing for storage indexes' t3
     from dual connect by level < 10000000;
SQL> select bytes/1024/1024 as mb from user_segments where segment_name = 'ORACLEDBA_EMP1';

Script de mesure (sess_wait)

Deux requêtes de suivi des statistiques de session, à sauvegarder en script réutilisable (sess_wait.sql) pour être rejouées entre chaque test :

Version « nommée » (avec libellé lisible) — attention, la clause in (...) source contenait une virgule manquante entre les deux valeurs, corrigée ici :

col stat_value format 9,999.999
select
    decode(name,
        'cell physical IO bytes saved by storage index', 'SI Savings',
        'cell physical IO interconnect bytes returned by smart scan', 'Smart Scan'
    ) as stat_name,
    value/1024/1024 as stat_value
from v$mystat s, v$statname n
where s.statistic# = n.statistic#
and n.name in (
    'cell physical IO bytes saved by storage index',
    'cell physical IO interconnect bytes returned by smart scan'
)
/

Version brute (toutes les valeurs, sans renommage) :

select
    name, value/1024/1024 as stat_value
from v$mystat s, v$statname n
where s.statistic# = n.statistic#
and n.name in (
    'cell physical IO bytes saved by storage index',
    'cell physical IO interconnect bytes returned by smart scan'
)
/

Sauvegarde et rejeu du script :

SQL> save sess_wait
SQL> @sess_wait

Validation : requête avec Storage Index actif

On exécute plusieurs fois la même requête filtrante et on rejoue sess_wait après chaque passage, pour observer la progression des octets économisés par le Storage Index :

SQL> select * from oracledba_emp1 where t1 = 4711;
SQL> @sess_wait
SQL> select * from oracledba_emp1 where t1 = 4711;
SQL> @sess_wait
SQL> select * from oracledba_emp1 where t1 = 4711;
SQL> @sess_wait

Contre-épreuve : désactivation du Storage Index

Le paramètre caché _kcfis_storageidx_disabled permet de désactiver le Storage Index pour la session, afin de comparer avec le comportement par défaut. Repérage des paramètres cachés liés au Storage Index et au Smart Scan côté cellule :

SQL> connect / as sysdba
SQL> set pages 200
col NAME format a40
col VALUE format a10
col DESCRIPTION format a40
col TYPE format a10
col DEFLT format a10
set lines 140
select a.ksppinm name,
       b.ksppstvl value,
       b.ksppstdf deflt,
       decode(a.ksppity, 1, 'boolean', 2, 'string', 3, 'number', 4, 'file', a.ksppity) type,
       a.ksppdesc description
from sys.x$ksppi a, sys.x$ksppcv b
where a.indx = b.indx
and (a.ksppinm like '\_%storageidx_disabled%' escape '\'
     or a.ksppinm like '\_%cell_smart_scan%' escape '\')
order by name;
SQL> conn testidx/<mot_de_passe>
SQL> @sess_wait
SQL> alter session set "_kcfis_storageidx_disabled" = true;
SQL> select * from oracledba_emp1 where t1 = 4711;
SQL> @sess_wait
SQL> variable b number
SQL> exec :b := 1541;
SQL> select * from oracledba_emp1 where t1 = 4711;
SQL> @sess_wait

En comparant les deux séries de résultats, la valeur SI Savings doit rester nulle storage index désactivé, alors qu'elle progresse dans le premier test.

Table de contrôle

Pour comparer avec une table sans historique de Storage Index construit :

SQL> @sess_wait
SQL> set pages 0
SQL> create table oracledba_emp2 as select * from oracledba_emp1;

Voir aussi

  • Archi exadata — principe du Storage Index et du Smart Scan
  • Cellcli — inspection des Storage Indexes côté cellule