Oracle Database
Astuces
Recherche…
Paramètres
Paramètres | Détails |
---|---|
Degré de parallélisme (DOP) | C'est le nombre de connexions / processus parallèles que vous souhaitez que votre requête ouvre. C'est généralement 2, 4, 8, 16 etc. |
Nom de la table | Le nom de la table sur laquelle l’indicateur parallèle sera appliqué. |
Conseil parallèle
Les indicateurs parallèles au niveau des instructions sont les plus simples:
SELECT /*+ PARALLEL(8) */ first_name, last_name FROM employee emp;
Les indications parallèles au niveau de l'objet donnent plus de contrôle mais sont plus sujettes aux erreurs. Les développeurs oublient souvent d'utiliser l'alias au lieu du nom de l'objet, ou oublient d'inclure des objets.
SELECT /*+ PARALLEL(emp,8) */ first_name, last_name FROM employee emp;
SELECT /*+ PARALLEL(table_alias,Degree of Parallelism) */ FROM table_name table_alias;
Disons qu'une requête prend 100 secondes pour s'exécuter sans utiliser de conseil parallèle. Si nous modifions DOP à 2 pour la même requête, la même requête avec indication parallèle prendra idéalement 50 secondes. De même, l'utilisation de DOP 4 prend 25 secondes.
En pratique, l'exécution parallèle dépend de nombreux autres facteurs et ne s'adapte pas de manière linéaire. Cela est particulièrement vrai pour les petits temps d'exécution où la charge parallèle peut être supérieure aux gains de l'exécution sur plusieurs serveurs parallèles.
USE_NL
Utilisez des boucles imbriquées.
Utilisation: use_nl(AB)
Cet indice demande au moteur d'utiliser la méthode de boucle imbriquée pour joindre les tables A et B. Il s'agit d'une comparaison ligne par ligne. L'indice ne force pas l'ordre de la jointure, demande simplement NL.
SELECT /*+use_nl(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
APPEND HINT
"Utiliser la méthode DIRECT PATH pour insérer de nouvelles lignes".
L'indicateur APPEND
indique au moteur d'utiliser le chargement direct du chemin . Cela signifie que le moteur n'utilisera pas un insert conventionnel utilisant des structures de mémoire et des verrous standard, mais écrira directement les données dans le tablespace. Crée toujours de nouveaux blocs qui sont ajoutés au segment de la table. Ce sera plus rapide, mais a quelques limitations:
- Vous ne pouvez pas lire la table que vous avez ajoutée dans la même session jusqu'à ce que vous validiez ou annuliez la transaction.
- S'il existe des déclencheurs définis sur la table, Oracle n'utilisera pas le chemin direct (c'est une autre histoire pour les chargements sqlldr).
- autres
Exemple.
INSERT /*+append*/ INTO Employees
SELECT *
FROM Employees;
USE_HASH
Indique au moteur d'utiliser la méthode de hachage pour joindre des tables dans l'argument.
Utilisation: use_hash(TableA [TableB] ... [TableN])
Comme expliqué dans de nombreux endroits , "dans une jointure HASH, Oracle accède à une table (généralement le plus petit des résultats joints) et construit une table de hachage en mémoire sur la clé de jointure. Elle analyse ensuite l'autre table de la jointure un) et sonde la table de hachage pour y rechercher les correspondances. "
Il est préférable d'utiliser la méthode Nested Loops lorsque les tables sont grandes, qu'aucun index n'est disponible, etc.
Remarque : L'indicateur ne force pas l'ordre de la jointure, demande simplement la méthode HASH JOIN.
Exemple d'utilisation:
SELECT /*+use_hash(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
PLEIN
L'indication FULL indique à Oracle d'effectuer une analyse complète de la table sur une table spécifique, peu importe si un index peut être utilisé.
create table fullTable(id) as select level from dual connect by level < 100000;
create index idx on fullTable(id);
Sans indices, l'index est utilisé:
select count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | INDEX RANGE SCAN| IDX | 2 | 26 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
FULL Hint force une analyse complète:
select /*+ full(f) */ count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 47 (3)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | TABLE ACCESS FULL| FULLTABLE | 2 | 26 | 47 (3)| 00:00:01 |
--------------------------------------------------------------------------------
Cache de résultat
Oracle ( 11g et plus ) permet aux requêtes SQL d'être mises en cache dans le SGA et réutilisées pour améliorer les performances. Il interroge les données du cache plutôt que de la base de données. L'exécution ultérieure de la même requête est plus rapide car les données sont maintenant extraites du cache.
SELECT /*+ result_cache */ number FROM main_table;
Sortie -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:02.20
Si j'exécute à nouveau la même requête maintenant, le temps d'exécution diminuera car les données sont désormais extraites du cache qui a été défini lors de la première exécution.
Sortie -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:00.10
Notez que le temps écoulé est passé de 2,20 secondes à 0,10 seconde .
Le cache de résultats contient le cache jusqu'à ce que les données de la base de données soient mises à jour / modifiées / supprimées. Toute modification libère le cache.