J'ai une table - SupplyNetwork, y compris quatre colonnes:
CustomerID, fournisseur, fournisseur_productid, achat_year p> blockQuote>
. p>
Je souhaite construire une paire client où les deux clients ontchètent le même produit du même fournisseur d'une année focale. J'utilise le
auto-jointure code> pour le faire dans
bigquery code> .mais c'est trop lent. Toute alternative? P>
xxx pré> p>
3 Réponses :
Utilisez une syntaxe de jointure et indexez la colonne de la clientèle
Le temps d'exécution NOPE restera le même, quelle que soit la syntaxe que vous utilisez.Indexing peut aider s'il n'est pas un OLTP, car les indices ralentissent avec plusieurs inserts et mises à jour.
Vous pouvez utiliser l'agrégation pour obtenir tous les clients em> qui répondent aux conditions d'une seule ligne: Vous pouvez alors obtenir des paires à l'aide des opérations de tableau: P > with pss as (
select Purchase_Year, Supplier_productID, SupplierID,
array_agg(distinct CustomerID) as customers
from supplynetwork sn
group by Purchase_Year, Supplier_productID, SupplierID
)
select c1, c2, pss.*
from pss cross join
unnest(pss.customers) c1 cross join
unnest(pss.customers) c2
where c1 < c2;
Vous pouvez utiliser croix rejoindre code>, qui (même si un cartésien) peut probablement vous donner un avantage de la simplicité. Essayez cette requête ci-dessous et voyez si c'est moins cher que votre base:
Conseil d'aujourd'hui: utilisez toujours la syntaxe code> joindre code> code>. Plus facile à écrire (sans erreur), plus facile à lire (et à maintenir) et plus facile à convertir en une jointure extérieure si nécessaire. (Notez que ce n'est pas la réponse à votre problème de performance.)
Vous devez passer à
A.CUSTOMERID pour éviter les doublons. Comme il est maintenant, vous obtenez les deux, B et B, A.