Voici ma question:Pourquoi cette requête aboutit-elle à un MERGE JOIN CARTESIAN dans Oracle?
select count(*)
from email_prod_junc j
inner join trckd_prod t5 on j.trckd_prod_sk = t5.trckd_prod_sk
inner join prod_brnd b on t5.prod_brnd_sk = b.prod_brnd_sk
inner join email e on j.email_sk = e.email_sk
inner join dm_geography_sales_pos_uniq u on (u.emp_sk = e.emp_sk and u.prod_brnd_sk = b.prod_brnd_sk)
L'expliquer le plan dit:
cartésienne jointure entre DM_GEOGRAPHY_SALES_POS_UNIQ et EMAIL_PROD_JUNC.
Je ne comprends pas pourquoi parce qu'il y a une condition de jointure pour chaque table.
Est-ce que la fusion de cartes cartésiennes entraîne des problèmes de performances ou ne vous attendez-vous pas à la voir? Si l'une des tables que vous rejoignez pour avoir un petit nombre de lignes fusionne, la fonction cartésienne peut être invoquée. La version Oracle serait également utile car les optimiseurs sont beaucoup modifiés/améliorés d'une version à l'autre. –
Oui, la requête a pris plus d'une minute pour revenir avec la jointure cartésienne. Une fois que j'ai ajouté l'indice ordonné, il est revenu en <1s. C'est Oracle 10g. Trckd_Prod et Prod_Brnd sont des petites tables, les 3 autres sont très grandes. –
@MarkSherretta - l'optimiseur 10g est connu pour être floconneux et pour exiger des conseils dont les versions ultérieures de l'optimiseur n'ont pas besoin. 11,1 est assez solide - 11,2 mieux. Je n'ai aucune expérience personnelle avec 12 donc je ne peux pas dire comment ça se passe. –