Maison >base de données >tutoriel mysql >Pourquoi les FDU dans les requêtes SQL produisent-elles parfois des produits cartésiens au lieu de jointures externes ?

Pourquoi les FDU dans les requêtes SQL produisent-elles parfois des produits cartésiens au lieu de jointures externes ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-19 01:14:10893parcourir

Why Do UDFs in SQL Queries Sometimes Produce Cartesian Products Instead of Outer Joins?

UDF dans les requêtes SQL et les produits cartésiens

L'utilisation de fonctions définies par l'utilisateur (UDF) dans les requêtes SQL peut conduire à un produit cartésien au lieu de la jointure externe complète prévue. Un produit cartésien se produit lorsque toutes les lignes d'une table sont combinées avec toutes les lignes d'une autre table, ce qui donne un ensemble de données beaucoup plus volumineux qu'une jointure externe complète.

Pourquoi une UDF provoque-t-elle un produit cartésien ?

Les UDF introduisent un niveau de complexité supplémentaire qui empêche l'optimisation par le moteur de requête. Une UDF peut accepter n'importe quel nombre d'arguments avec un comportement non déterministe. Pour évaluer l'UDF pour toutes les combinaisons possibles de lignes, le moteur de requête doit effectuer un produit cartésien.

En revanche, une simple comparaison d'égalité entre les colonnes (par exemple, t1.foo = t2.bar) a un comportement prévisible . Le moteur de requête peut utiliser cela pour optimiser la jointure en mélangeant les lignes en fonction des colonnes foo et bar, évitant ainsi le besoin d'un produit cartésien.

Application des jointures externes

Malheureusement, il n'existe aucun moyen simple de forcer une jointure externe sur un produit cartésien dans l'exemple ci-dessus. La seule option serait de modifier le moteur Spark SQL.

Comme expliqué ci-dessus, le produit cartésien est une conséquence de la nature arbitraire et non déterministe des UDF. Le moteur de requêtes ne peut pas les optimiser sans introduire des contraintes supplémentaires.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn