2010-04-20 7 views
3

Lorsque nous joignons plus de 2 tables, oracle ou d'ailleurs toute base de données décide de joindre 2 tables et d'utiliser le résultat pour rejoindre les tables suivantes. Existe-t-il un moyen d'identifier la taille de jointure intermédiaire. Je suis particulièrement intéressé par Oracle. Une solution que je connais est d'utiliser Autotrace dans sqldeveloper qui a la colonne LAST_OUTPUT_ROWS. Mais pour les requêtes exécutées par pl/sql et d'autres moyens, oracle enregistre-t-il la taille de la jointure intermédiaire dans une table? Je demande cela parce que récemment nous avons eu un problème car quelqu'un a laissé tomber les statistiques et n'a pas réussi à le régénérer et quand nous avons découvert que l'oracle a formé une table intermédiaire de 180 millions de lignes avant d'arriver au résultat final de 6 lignes et la requête était assez lente.Taille de table de jointure intermédiaire Oracle

Répondre

2

Oracle peut matérialiser les résultats intermédiaires d'une jointure de table dans l'ensemble de segments temporaire de votre session.

Comme il s'agit d'une table unique supprimée une fois la requête terminée, ses statistiques ne sont pas stockées.

Cependant, vous pouvez estimer sa taille en construisant un plan pour la requête et regarder ROWS paramètres de l'opération appropriée:

EXPLAIN PLAN FOR 
WITH q AS 
     (
     SELECT /*+ MATERIALIZE */ 
       e1.value AS val1, e2.value AS val2 
     FROM t_even e1, t_even e2 
     ) 
SELECT COUNT(*) 
FROM q 

SELECT * 
FROM TABLE(DBMS_XPLAN.display()) 

Plan hash value: 3705384459 

--------------------------------------------------------------------------------------------------------- 
| Id | Operation     | Name      | Rows | Bytes | Cost (%CPU)| Time  | 
--------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT   |       |  1 |  | 43G (5)|999:59:59 | 
| 1 | TEMP TABLE TRANSFORMATION |       |  |  |   |   | 
| 2 | LOAD AS SELECT   |       |  |  |   |   | 
| 3 | MERGE JOIN CARTESIAN |       | 100T| 909T| 42G (3)|999:59:59 | 
| 4 |  TABLE ACCESS FULL  | T_ODD      | 10M| 47M| 4206 (3)| 00:00:51 | 
| 5 |  BUFFER SORT   |       | 10M| 47M| 42G (3)|999:59:59 | 
| 6 |  TABLE ACCESS FULL  | T_ODD      | 10M| 47M| 4204 (3)| 00:00:51 | 
| 7 | SORT AGGREGATE   |       |  1 |  |   |   | 
| 8 | VIEW     |       | 100T|  | 1729M (62)|999:59:59 | 
| 9 |  TABLE ACCESS FULL  | SYS_TEMP_0FD9D6604_2660595 | 100T| 909T| 1729M (62)|999:59:59 | 
--------------------------------------------------------------------------------------------------------- 

Ici, la table matérialisée est appelée SYS_TEMP_0FD9D6604_2660595 et le nombre d'enregistrements est estimé 100T (100,000,000,000,000 enregistrements)

Questions connexes