Le principe est simple, il s'agit de balayer la totalité de la table
Ce balayage peut être réalisé en parallèle
1. Parallel pre-fetch
Le chargement du fichier est réalisé en parallèle
cette option est automatiquerment choisie par l'optimiseur si le temps prévu pour les I/O est supérieur au temps CPU prévu.Il faut autoriser cela par QQRYDEGREE et de préférence faire tourner le requête dans un pool avec expert cache actif (*CALC)
2. Parallel table scan
Idem au 1/ mais en plus le traitement de la table (une fois chargée en mémoire) est éclaté sur l'ensemble des processeurs.
Vous devez installer le dispositif facturable DB2/ SMP
3. Parallel table pre-load et parallel Index pre-load
Le chargement de la table et des index est réalisé en parallèle et en tache de fond, pendant le traitement de la requête (il faut beaucoup de mémoire, pour que cela soit efficace)
Utilisation d'un Index pour réaliser les tests contenus dans la requête.
Index B-arbre
ATTENTION, les Index EVI ne peuvent pas être utilisés pour les jointures.
Il vous faut donc encore quelques index b-tree sur les clefs primaires et étrangères, CE QUI EST FAIT en AUTOMATIQUE si vous mettez en place l'intégrité référentielle de DB2/400 (PRIMARY KEY et FOREIGN KEY)
JOINTURES et GROUPAGE
Le premier enregistrement de la table 1 est relié aux enregistrements de table2 suivant la valeur de clé (utilisation d'un index) , chaque enregistrement étant lui-même reliè à table3 etc
Quand la jointure est complète, on passe à l'enregistrement suivant de table1 jusqu'à épuisement.
Cette technique est utilisée quand moins de 20 % des enregistrements sont retournés.
On fabrique une nouvelle table (en mémoire)) dans laquelle on place les enregistrements selon la méthode du hash-coding. Il s'agit d'établir une correspondance entre la valeur d'une clé et la position physique de l'enregistrement par le jeu d'une fonction (souvent basée sur un nombre premier).la localisation d'une ligne est alors particulièrement rapide.
La table de hachage peut être construire
en parallèle avec SMP
Cette technique n'est possible que si le paramètre
ALWCPYDTA est fixé à *OPTIMIZE et
si la jointure est INTERNE (pas de LEFT OUTER
JOIN).
Les deux tables sont triées suivant la valeur de la zone de jointure, puis l'on applique la jointure sur le résultat.
Un index n'est pas utile, cette technique est utilisée si plus de 20 % des lignes sont sélectées.
Faut-il utiliser la journalisation SUR DES BASES DECISIONELLES ?
Par contre pensez à enlever SMAPP (fonction
de l'OS, provoquant une journalisation temporaire
des index afin de proposer une reprise plus rapide)
par la commande CHGRCYAP SYSRCYTIME(*NONE).
L'optimiseur prend des décisions en fonction de la mémoire disponible.
Il 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.
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)
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 admises, elle n'a lieu que quand il est impossible de faire autrement
- *OPTIMIZE la copie des données est
admises, elle aura lieu à chaque fois
que cela améliorera
les temps de réponses
(particulièrement le hachage pour les
jointures)
c'est cette dernière valeur qu'il faut
privilégier (elle est par défaut
via ODBC./JDBC).
Ce paramètre est renseignable par la valeur système QQRYDEGREE (pour tout le monde) ou via le paramètre DEGREE de la commande CHGQRYA (session en cours)
le point du vue du lab est le suivant : ( http://www.as400.ibm.com/developer/bi/teraplex/lessons.html#bigdials)
In the Teraplex Center, we have found that *MAX is most useful during the warehouse creation and update processes. For warehouse environments with many users running complex queries, running with SMP turned off is often a beter choice because the system will automatically send each query to its own processor. |
En résumé, à utiliser pendant la phase de chargement de la base décisionnelle (traitement s'exécutant seul), à enlever si des utilisateurs travaillent pendant les mises à jour, l'OS/400 répartissant de lui-même les tâches sur l'ensemble des processeurs.
Par contre, si cela est possible, lors des mises à jour lourdes, le parallélisme améliorera grandement le temps de maintenance des index (lors du chargement initial, le plus simple est de construire les index après).
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 la
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)
voyez aussi le fichier d'option QAQQINI
1/ passez la commande STRDBG avant de lancer SQL en mode 5250 ,
vous verrez alors après chaque requête
des messages CPI43xx ansi que SQL79xx dans l'historique
indiquant les choix de l'optimiseur.
ID message Texte du message CPI4321 Chemin d'accès créé pour le fichier &4. CPI4322 Chemin d'accès créé à partir du fichier avec clé &1. CPI4323 Le plan d'accès du processeur de requêtes de l'OS/40 CPI4324 Fichier temporaire créé pour le fichier &1. CPI4325 Fichier résultat temporaire créé pour la requête. CPI4326 Fichier &1 traité en position de jointure &11. CPI4327 Fichier &1 traité en position de jointure 1. CPI4328 Chemin d'accès du fichier &4 utilisé par la requête. CPI4329 Séquence d'accès par ordre d'arrivée utilisée pour la requête CPI433A Impossible d'extraire le fichier d'options de requêtes CPI433B Impossible de mettre à jour le fichier d'options de requêtes CPI433C Bibliothèque &1 introuvable. CPI433D Options de requête utilisées pour créer le plan d'accès SQL7910 Les curseurs SQL ont été fermés. SQL7911 0 ODP réutilisé. SQL7912 0 ODP créé. SQL7913 0 ODP supprimé. SQL7914 0 ODP non supprimé. SQL7915 0 Le plan d'accès de l'instruction SQL a été construit SQL7916 0 Groupage utilisé pour la requête. SQL7917 0 Plan d'accès non mis à jour. SQL7918 10 ODP réutilisable supprimé. SQL7919 0 Conversion de données nécessaire pour FETCH ou SELECT SQL7939 0 Conversion de données nécessaire pour INSERT ou UPDATE |
2/ 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 :
3/ Pour les Batch, utilisez le Moniteur base de données :
dans une session 5250, lancez la commande STRDBMON
via Operation navigator : choisissez base de
données/moniteur de performances SQL
V4R5, Visual
Explain
Vous pouvez maintenant obtenir une Explication graphique du détail d'une requête SQL avec Visual Explain :
Le bouton EDITION 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 |
![]() |
Visual Explain vous affiche alors le détail des différentes phases de la requête :
ICI, la phase de jointure
Vous pouvez aussi lancer Visual Explain sur le résultat
d'un moniteur de performance base de données.
de nouvelles zones ont étés ajoutées
pour Visual Explain
![]()
une fois le moniteur arrêté :
![]()
![]()
![]()