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

Pourquoi les FDU dans les jointures SQL produisent-elles parfois des produits cartésiens au lieu des jointures attendues ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-18 16:38:17136parcourir

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

Pourquoi les FDU conduisent à des produits cartésiens dans les requêtes SQL

Lors de l'utilisation de SQL, les fonctions définies par l'utilisateur (FDU) peuvent introduire des problèmes de performances inattendus. Cela est particulièrement évident dans les opérations de jointure, où les FDU peuvent conduire à des produits cartésiens au lieu de la jointure externe complète souhaitée.

Cause des produits cartésiens

L'utilisation des FDU nécessite l'évaluation de fonctions arbitraires avec des domaines potentiellement infinis et un comportement non déterministe. Pour déterminer la valeur de ces fonctions, le système doit considérer toutes les combinaisons d'arguments possibles, aboutissant à un produit cartésien.

Exemple

Considérez les requêtes SQL fournies dans le fichier donné Databricks-Question :

-- Query 1: Join without UDF
SELECT col1, col2 FROM table1 AS t1 JOIN table2 AS t2 ON t1.foo = t2.bar;

-- Query 2: Join with UDF
SELECT col1, col2 FROM table1 AS t1 JOIN table2 AS t2 ON equals(t1.foo, t2.bar);

Dans la requête 1, la simple condition d'égalité permet le brassage des données en fonction du foo et des colonnes à barres, produisant le résultat attendu. Cependant, dans la requête 2, l'utilisation de la fonction UDF égale nécessite d'évaluer la fonction pour toutes les combinaisons de paires possibles, ce qui donne un produit cartésien.

Solution

Forcer une valeur externe la jointure sur un produit cartésien n'est généralement pas possible sans modifier le moteur Spark SQL. Cependant, l'optimisation de l'UDF elle-même pour réduire le nombre d'évaluations pourrait atténuer une partie de la dégradation des performances.

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