Requêtes et performances

Ce cours manipule des concepts comme les sous-systèmes et les pools mémoire qui doivent vous être familiers, si ce n'est pas le cas, voyez cette introduction


I/ Les leviers à notre disposition

 les préconisations matérielles d'IBM pour les bases décisionnelles, sont les suivantes :

Le système garde en mémoire de nombreuses informations liées à la base de données :

D'un point de vue base de données, il faut éviter les IPL trop fréquent qui risque d'engendrer le syndrome "Lundi matin" quant aux temps de réponse.

  Les recommandations sont claires : IPL mensuel voire trimestriel,
vous en profiterez pour appliquer les derniers groupes PTF, particulièrement le DATABASE GROUP qu'il faut suivre régulièrement sur
http://www-912.ibm.com/s_dir/sline003.nsf/GroupPTFs?OpenView&view=GroupPTFs

Faut-il utiliser la journalisation

SUR DES BASES de PRODUCTION, bien sûr !

SUR DES BASES DECISIONELLES ?


Par contre, toujours sur ces bases décisionnelles, pensez à :

 

L'optimiseur prend des décisions en fonction de la mémoire disponible, tout en essayant de laisser de la mémoire aux autres travaux (fair share)

CQE  effectue un calcul simple : "taille du pool/ niveau d'activité" = mémoire maxi par job.


Si votre requête s'exécute seule dans un pool (ce qui est conseillé) , descendez le niveau d'activité à 1.



»Pour travailler dans un Pool dédié :


allouez de la mémoire à un Pool partageable : CHGSHRPOOL *SHRPOOLn SIZE(xxx)

créez un sous système utilisant ce pool :

CRTSBSD MONSBS POOLS((1 *SHRPOOL1)) TEXT('Sous système dédié')
puis
ADDRTGE MONSBS SEQNBR(10) CMPVAL(*ANY) PGM(QCMD) CLS(QBATCH)    

                      

                                      


» En même temps, utilisez l'expert cache qui est toujours une bonne solution pour les accès base de données, dans des pools mémoire de plus de 100 Mo
(on garde en mémoire les tables les plus utilisées).

Cela se paramètre par CHGSHRPOOL PAGING(*CALC)

SQE, lui divise la taille du pool par le nombre moyen de travaux
    (expert cache obligatoire, pour faire la moyenne)

ATTENTION, Si vous faites des tests, le deuxième test ira toujours plus vite que le premier, du fait que les données sont (partiellement ?) restées en mémoire, ce qui peut fausser vos mesures.

Placez vous alors Obligatoirement dans un pool ou vous êtes seul, et lancez entre deux requêtes :
CLRPOOL POOL(*SHRPOOL1)

-> Pour garder les données complètement en mémoire pour pouvez utiliser la commande SETOBJACC ou bien la nouvelle fonctionnalité de la version 7 :

 

 

- Le pool mémoire utilisé est celui indiqué par MEMORY_POOL_PREFERENCE du fichier QAQQINI, qui doit être à *CALC :

 

- Le fichier est monté en mémoire "à la demande" (lors de la première requête) en mode asynchrone et en parallèle
 (contrairement à SETOBJACC qui n'utilisait qu'un seul thread)

 

- La conservation complète du fichier n'est pas garantie, mais si vous avez de la mémoire elle est fort probable


Pour visualiser la mémoire consommée par SQL, Regardez SYSTMPSTG (Bucket *DATABASE...)


Ce paramètre est renseignable sur les commandes STRSQL , RUNSQLSTM


- *NO la copie des données n'est pas admises (pour des besoins de temps réel)

- *YES la copie des données est admise, elle n'a lieu que quand il est impossible de faire autrement

- *OPTIMIZE la copie des données est admise, elle aura lieu à chaque fois que cela améliorera les temps de réponses
(particulièrement le hachage pour les jointures et les index bitmap)


c'est cette dernière valeur qu'il faut privilégier (elle est par défaut via ODBC./JDBC).


Vous pouvez influencer l'optimiseur de requêtes en indiquant le nombre de lignes à traiter en même temps :


Si vous indiquez une petite valeur, l'optimiseur cherche à rendre un résultat le plus rapide possible, vous le forcer à utiliser des index, même si le temps global doit en pâtir.
C'est une solution interactive (STRSQL considère, sans indication de votre part, une optimisation pour 3% des lignes du fichier)

Si vous indiquez une GRANDE valeur (FOR ALL ROWS est admis depuis V4R30) l'optimiseur privilégie le temps global de traitement. Vous favoriserez les copies temporaires, les tris, le hachage s'ils sont plus efficaces)

C'est une solution purement orientée batch et gros volumes.
(INSERT into …SELECT … FORM …, est toujours traité pour un nombre maxi de lignes)


 


II/ Les outils de mesure :

a/ Commandes système


WRKSYSSTS (gestion de la mémoire)


ATTENTION, tous ces écrans vous offrent des moyennes, il faut visualiser des données qui ont au moins 2 minutes .


la documentation V5R40 indique comme base de calcul rapide, par pool (ligne) :

c*p, où
  c
est le pourcentage de CPU utilisé
  p est le nombre de processeurs de la partition

par exemple

1 processeur à 36 % = 36 de taux de pagination maxi
1,8 processeur (LPAR) utilisé à 80% = 144

C'est aussi cet écran (par F11) qui permet de fixer l'expert cache.


WRKDSKSTS (gestion des disques)

 

cet écran montre le taux d'occupation des disques (l'idéal est un taux de 75 % au maximum)
ainsi que l'activité des bras (% util).Une activité au delà de 50% indique des disques très occupés.

si la répartition n'est pas linéaire (achat de nouveaux disques, par exemple), passez la commande STRASPBAL TYPE(*CAPACITY)

 

b/ Base de données

D'abord un petit, "truc", mettez le paramètre QRYTIMLMT à 0 par la commande CHGQRYA :

toutes vos requêtes seront alors refusées (CPA4259) , l'optimiseur vous indiquant le temps qu'il a prévu.


1/ En interactif, passez la commande STRDBG avant de lancer SQL en mode 5250 ,

vous verrez alors après chaque requête des messages CPI43xx ainsi que SQL79xx dans l'historique indiquant les choix de l'optimiseur lors de la création du plan d'accès


2/ pour un programme, vous pouvez voir le plan d'accès par la commande PRTSQLINF

vous verrez alors, dans un spool portant le nom du pgm, pour chaque requête des messages SQL40xx

 

3/ Pour les Batch, utilisez le Moniteur base de données :


dans une session 5250, lancez la commande STRDBMON

rappel, utilisez les paramètres suivants

-  RUNTHLD : seuil en secondes, de temps d'exécution
-  STGTHLD : seuil en Mo de mémoire utilisée
-  FTRFILE : filtrage du moniteur sur un nom de fichier
-  FTRUSER : filtrage du moniteur sur un profil utilisateur
-  FTRINTNETA : filtrage du moniteur sur une adresse IP cliente
-  FTRQRYGOVR : filtrage du moniteur sur l'annulation de la demande pour dépassement de critère donné par CHGQRYA

    -> pour analyser ensuite le résultat, IBM propose la création de vues voir https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzajq/lofdds.htm


    ou, mieux,

    via iSeries Navigator (voir ci-dessous) : choisissez "base de données"/"moniteur de performances SQL"


Les outils graphiques

1/ le gestionnaire de scripts SQL (CWBUNDBS.EXE)

Vous pouvez :


Il subit de nombreux changements en version 6

1/ une option ALLOW SAVE RESULT, permet la sauvegarde des enregistrements extraits:

ensuite, avec un clic droit sur les lignes affichées :


Les formats admis, sont :

Les paramètres de connexion (JDBC) peuvent être modifiés temporairement ou définitivement

et proposent maintenant l'affichage des COLHDG plutôt que les noms de zone en entête de colonne


La(les) requêtes(s) peuvent être sauvegardée(s) sur le serveur (fichier physique ou IFS)

Ce qui accompagne très bien le nouveau paramètre SRCSTMF de la commande RUNSQLSTM


2/ le moniteur de perf. Base de données.

cliquez sur moniteur de Base de données / nouveau ...




remarquez :


Choix des travaux (comme en V5R30)


et récapitulatif final.

 

Quand la trace est terminée (l'arrêt est à votre charge), choisissez une vue (les données à afficher)



il s'agit en fait d'ordres SQL, lancés sur les fichiers stockés dans la bibliothèque choisie au début du paramétrage
.
, ci-dessous par utilisateur :







EN version 7 vous pouvez aussi utiliser IBM Navigator Director

Choisissez la bibliothèque et la collecte (ou laissez "la plus récente")

Mais surtout, nous avons maintenant (SF99701, level 18) des statistiques d'Entrée/Sortie globales (si la notion de collecte est démarrée)

Entrée/sortie base de donnée physiques, vue détaillée

Par travail :

Par sous-système

Par type de serveur

 

3/ Analyse des statistiques et des Index


Pour définir ou voir les statistiques, utilisez le clic droit sur une table

Le bouton nouveau, permet de définir une nouvelle collecte
Une message vous est affiché (la première fois au moins)


puis :



si vous demandez la durée estimée, on vous affiche (ici sur une table de 500.000 lignes)


puis cliquez sur

On vous rappelle alors vos choix concernant la valeur système QDBFSTCCOL


et les collectes sont soumises.

Pour voir les collectes en attente, cliquez droit sur l'option Base de données

la fenêtre permettant de créer une nouvelle collecte, donne aussi un accès aux informations concernant une collecte existante :

Vous pouvez retrouver le sources de ces procédures via System i Navigator (elles sont livrées "tel que") et les personnaliser.



Les possibilités d'affichage sur une instruction ont été étendues en V6

4/ Visual Explain

 

Vous pouvez maintenant obtenir une Explication graphique du détail d'une requête SQL avec Visual Explain :

 

 

Cet affichage a été revu en version 6 (plus de détails) :

 

Le bouton EDITION SQL, ou en V6 clic droit puis Gestion de l'instruction sql, place cette requête dans la fenêtre d'exécution de scripts SQL

 

Le bouton que voici lance la requête avec QRYTIMLMT à 0 (la requête ne sera pas vraiment exécutée, mais l'optimiseur aura fait son travail) , ce qui permet une analyse basée sur une estimation

en V6, Visual Explain peut être lancé et réactualisé, pendant l'exécution, les informations ayant bougé sont surlignées.

 

 

Visual Explain vous affiche alors le détail des différentes phases de la requête :

•Scannage de table et/ou utilisation d'un index

• phase de jointure

 


• pour terminer, Hachage pour le GROUP BY et production du résultat.


La fenêtre droite vous donne le détail pour chaque étape (ici la jointure)

en V6R10, le moteur possède un module d'auto-apprentissage, qui agit aujourd'hui dans 2 cas :


La V5R40 propose de commencer par établir des critères de collecte :

remarquez :


Choix des travaux


et récapitulatif final.


une fois le moniteur arrêté (ou importé):

En V5R30, on vous affiche toutes les instructions, en V5R40 vous pouvez au préalable, choisir vos critères d'affichage :








· Les informations affichées par Visual Explain

Chaque icône représente une action :

les actions peuvent être enchaînées : accès direct à un index (SETLL), puis balayage (READE)

Ces actions vont porter sur un/des objet(s) :
Icône STRDBG PRTSQLINF Commentaires
Table Scan
Table Scan
CPI4329 SQL4010 Utilisé pour retourner un grand nombre de lignes
Table Probe
Table Probe
 
Accès direct à une ligne par son n° de rang
(la connaissance du n° de rang peut venir d'une lecture d'index)
Index Scan
Index Scan
CPI4328 SQL4008
utilisé pour retourner un petit nombre de lignes, si l'index correspond au critère de tri ET à une sélection, par exemple.
Index Probe
Index Probe
CPI4338 SQL4032
utilisé pour retourner un petit nombre de lignes, l'index permettant de réaliser la sélection la plus importante
(primary key, par exemple)

Index Probe
EVI Probe
CPI4328 SQL4008
SQL4011
utilisé éventuellement avec d'autres pour créer un bitmap, entraîne ensuite un accès direct sur la table (table probe)
Icône STRDBG PRTSQLINF Commentaires
Hash Scan
Hash Scan
CPI4329 SQL4010
SQL4029
Utilisé  principalement pour la gestion du GROUP BY
Table Probe
HASH Probe
CPI4327 SQL4007
SQL4011
Utilisé principalement pour la jointure
Temporary Sort List
Liste triée (Scan)
CPI4328
CPI4325
SQL4008
SQL4002
Utilisé  pour Order BY et l'option DISTINCT
Temporaty List Probe
Liste triée (Probe)
CPI4327 SQL4007
SQL4010
Utilisé pour une jointure avec un autre critère que l'égalité
Temporary List
Liste simple (Scan)
CPI4325
CPI4327
SQL4007
SQL4010
Utilisé pour préparer une utilisation parallèle (SMP)
Temporaty Row Scan
Liste numérotée (Scan)



Utilisé avec des index multiples pour favoriser ensuite le groupage des I/O disque.  (récupération physique des lignes par paquet)
Temporaty Row Probe
Liste numérotée
(Accès direct)
 CPI4338  SQL4032 technique bitmap pour combiner plusieurs index et limiter ensuite l'accès direct aux lignes de la table
Bitmap Scan
Bitmap Scan
 CPI4338  
SQL4010
SQL4032
technique pour combiner plusieurs index en un index bitmap.

Un index bitmap est un nuage de point ou chaque position représente l'adresse, un liste numérotée contient les adresses (N° de rang)
Bitmap Probe
Accès direct Bitmap
 CPI4338 SQL4011
SQL4032
technique bitmap pour combiner plusieurs index et limiter ensuite l'accès direct aux lignes de la table
Index Scan
Index Scan
CPI4321 SQL4009
création d'un index temporaire pour tri ou groupage
 (de plus en plus rare)

Index Probe
Index Probe
CPI4321 SQL4009
création d'un index temporaire probablement pour jointure
BUffer Scan CPI4330 SQL4030 Objet temporaire utilisé lors des opérations de parallélisme (SMP)

Enfin, l'icône vous donnera des informations globales (temps, nombre de lignes résultat , ...)

Nouveaux en V5R40
Index Probe
EVi table Scan, preload
CPI4328 SQL4008
utiliser pour retrouver les entrées à partir uniquement de la table des symboles d'un index EVI
    BUffer Scan
    QUEUE/DEQUEUE
(pas de message) (pas de message) QUEUE, Objet temporaire pour mémoriser des données durant une requête récursive


Nouveaux en V6R10

Index Probe
temporary distinct Sorted list Scan
(pas de message) (pas de message) Liste triée de valeurs distinctes, utilisée pour GROUP BY ROLLUP
              BUffer Scan
    temporary value List Scan
CPI4329
Arrival sequence
was used for file *VALUES
SQL4010 Liste de valeurs temporaires, utilisée avec VALUES( )


Nouveaux en V7 (les index EVI peuvent maintenant être utilisés en lecture pour GROUP BY et DISTINCT)

Index Probe
EVI Table SCAN, preload
CPI4328
SQL4008 Lecture d'un Index EVI avec INCLUDE pour fonction d'aggregation (GROUP BY)
             BUffer Scan
    EVI Table Probe, Preload
CPI4328
SQL4008 Lecture d'un Index EVI avec INCLUDE pour fonction d'aggregation (GROUP BY et WHERE)
             BUffer Scan
          UNNEST ARRAY
CPI4329
SQL4010 Utilisation de la fonction UNNEST d'un tableau SQL (ARRAY) dans une procédure
             BUffer Scan
          EVI Only Access
CPI4338
  Utilisation de deux index EVI, l'un pour la sélection, l'autre pour les colonnes à afficher (la table n'est pas lue, voir ce cours)

Visual Explain sait pleinement tirer profit de des nouveautés, comme la collecte de statistiques

Tout d'abord nous pouvons maintenant afficher l'historique du travail (contenant les messages DEBUG)

, ce qui s'affiche en bas

le Menu Option propose

• EN V7, la PTF SF99701 level 18 propose deux nouvelles colonnes lors de l'affichage des instructions d'un moniteur de performance

Il faut cliquez sur "Colonnes"


et choisir ces deux colonnes

qui affichent

Si on lance Visual Explain, auquel on demande les suggestions proposées





Copyright © 2016 VOLUBIS