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
Libérer: 2024-12-19 01:14:10
original
895 Les gens l'ont consulté

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal