Maison > base de données > tutoriel mysql > Comment LATERAL JOIN de PostgreSQL peut-il optimiser plusieurs appels de fonctions sur les arguments du tableau ?

Comment LATERAL JOIN de PostgreSQL peut-il optimiser plusieurs appels de fonctions sur les arguments du tableau ?

Patricia Arquette
Libérer: 2024-12-26 20:52:10
original
157 Les gens l'ont consulté

How Can PostgreSQL's LATERAL JOIN Optimize Multiple Function Calls on Array Arguments?

Optimisation des requêtes pour plusieurs appels de fonctions sur des arguments de tableau

Dans Postgres, il peut être inefficace d'appeler une fonction plusieurs fois sur un argument de tableau , surtout lorsque la fonction renvoie plusieurs colonnes. Explorons une stratégie d'optimisation des requêtes pour relever ce défi.

Considérons une fonction foo qui traite un tableau de lignes avec un paramètre donné et renvoie un ensemble de lignes plus une nouvelle colonne :

CREATE OR REPLACE FUNCTION foo(data data[], parameter int) RETURNS SETOF enhanceddata AS
...
Copier après la connexion

Initialement, la fonction fonctionne sur un seul ensemble de données en utilisant :

SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1) 
Copier après la connexion

Cependant, l'objectif est de la faire fonctionner pour plusieurs groupes de données sans en spécifiant un paramètre dataid.

Une approche consiste à utiliser une sous-requête pour agréger les données dans un tableau, puis à les transmettre à la fonction foo :

SELECT dataid, (foo(ARRAY_AGG(data)),1).*
FROM dataset
WHERE dataid = something -- only testing on 1
GROUP BY dataid
Copier après la connexion

Bien que cela puisse sembler logique, cela souffre du problème de l'appel de foo plusieurs fois, une pour chaque ligne de données.

Utilisation de la jointure latérale pour Optimisation

Pour optimiser cette requête, le PostgreSQl LATERAL JOIN peut être utilisé. Cette technique puissante crée un produit cartésien basé sur les lignes entre les résultats d'une sous-requête et les lignes d'une autre table. Dans ce cas, la sous-requête agrège les données dans un tableau et la jointure latérale exécute foo une fois pour chaque ligne du tableau agrégé.

En utilisant PostgreSQL 9.3 ou version ultérieure, la requête suivante optimise les multiples appels de fonction :

SELECT sub.dataid, f.*
FROM  (
   SELECT dataid, array_agg(data) AS arr
   FROM   dataset
   WHERE  dataid = something
   GROUP  BY 1
   ) sub
LEFT   JOIN LATERAL foo(sub.arr) f ON true;
Copier après la connexion

LEFT JOIN LATERAL garantit que toutes les lignes de la table de gauche (sous-requête) sont préservées, même si aucune ligne sont renvoyés par foo. Si la fonction ne peut renvoyer aucune ligne, c'est la syntaxe préférée.

Pour les fonctions qui renvoient toujours un résultat, la syntaxe simplifiée peut être utilisée :

CROSS JOIN LATERAL foo(sub.arr)
Copier après la connexion

ou son raccourci équivalent :

, foo(sub.arr)
Copier après la connexion

Comme souligné dans le manuel de Postgres, l'utilisation de LATERAL JOIN optimise les requêtes avec des fonctions de retour d'ensemble comme foo. Cette technique traite efficacement plusieurs groupes de données sans entraîner d'évaluations de fonctions inutiles.

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