2017-04-19 1 views
1

Je suis confronté à des problèmes de performance avec mon sqlcode. Utilisation de la plate-forme Tableaune peut pas joindre les tables correctement. temps infini pris par la requête

J'ai environ 11 jointures de tables. quand je débogue pour voir la performance des 10 tables jointes, c'est très rapide dans le tableau mais quand j'ajoute une autre table de billing_transaction, la requête ne se termine jamais même avec un petit ensemble de lignes.

Here est la DRE de la base de données entière. Quel pourrait être le problème que sa création d'une longue requête?

Voici le code SQL (je l'ai commenté la section sans DE tableau billing_transaction, faisait pour comparer les performances)

select 
    country.`name` as Country, 
    oper.`name` as Operator, 
    proj.`name` as Project, 
    club.`name` as Club, 
    prom.`name` as Promotor, 
    cust.`idCustomer` as SubscriberID, 
    cust_sub.`msisdn` as SubscriberMsidn, 
    cust.`customerSince` as SubscriberStartingDate, 
    cust_sub.`SubscribedDate` as SubscriberSubcribeDate, 
    cust_sub.`UnsubscribedDate` as SubscriberUnSubcribeDate, 
    cust_sub.`idCustomerSubscription` as SubscriptionID, 
    bt.`idBillingTransaction` as BillingTransactionID, 
    cust_sub.`eventId` as SubscriberEventID, 
    bt_status.`name` as BillingStatus, 
    bt.`price` as Pricefromsubscriber 



-- FROM `customersubscription` cust_sub (WITHOUT billing_transaction it WORKS FINE) 
-- LEFT JOIN `customer` cust on cust_sub.`idCustomer`=cust.`IdCustomer` 
-- LEFT JOIN `promoter` prom on cust_sub.`idPromoter`=prom.`id` 
-- LEFT JOIN `club` club on cust_sub.`idClub`=club.`idClub` 
-- LEFT JOIN `Project` proj on club.`idProject`=Proj.`idProject` 
-- LEFT JOIN `project_operator_relationships` proj_rel_oper on proj.`idProject`=proj_rel_oper.`projectId` 
-- LEFT JOIN `Operator` as oper on proj_rel_oper.`operatorId`=oper.`idOperator` 
-- LEFT JOIN `country` as country on oper.`idCountry`=country.`idCountry` 
-- LEFT JOIN `curreny_symbol` as curr_sym on country.`idCurrencySymbol`=curr_sym.`symbol`, 


FROM `billing_transaction` bt 
    LEFT JOIN `customersubscription` cust_sub on bt.`msisdn`=cust_sub.`msisdn` 
    LEFT JOIN `customer` cust on cust.`idCustomer`=cust_sub.`IdCustomer` 
    LEFT JOIN `billing_status` bt_status on bt.`idBillingStatus`=bt_status.`idBillingStatus` 
    LEFT JOIN `promoter` prom on cust_sub.`idPromoter`=prom.`id` 
    LEFT JOIN `club` club on cust_sub.`idClub`=club.`idClub` 
    LEFT JOIN `Project` proj on club.`idProject`=Proj.`idProject` 
    LEFT JOIN `project_operator_relationships` proj_rel_oper on proj.`idProject`=proj_rel_oper.`projectId` 
    LEFT JOIN `Operator` as oper on proj_rel_oper.`operatorId`=oper.`idOperator` 
    LEFT JOIN `country` as country on oper.`idCountry`=country.`idCountry` 
    LEFT JOIN `curreny_symbol` as curr_sym on country.`idCurrencySymbol`=curr_sym.`symbol` 

where proj.`idProject` IN (3, 19) 
-- where proj.`idProject` IN (3, 19, 23, 24, 27) 
    and date(cust_sub.`SubscribedDate`)>='2017-04-18 01:40:00' 
    and date(cust_sub.`SubscribedDate`)< '2017-04-18 02:00:00' 

Toutes les suggestions seront très appréciés. Déboguer tout mais je ne sais pas où sont les problèmes de performance. Mon approche (qui peut être erronée) est que, en prenant les tables billing_transaction, continuez à rejoindre et à additionner les informations dans les colonnes suivantes des lignes comme l'abonnement client , clients, opérateur, club, projet .... tout le chemin vers le pays. La jointure gauche convient-elle à un tel scénario? De même, la clause where doit provenir de la table billing_transaction (table principale) ou de la clause where de n'importe quelle table des tables jointes.

La séquence va comme ceci

Each customer has one or more subscription 
Each Subscription has one or more billing transaction 
Each billing transaction has one or more billing status 


Other relations are: 
Each customer subscription have one or more club 
Each customer subscription has one or more promotor 
Each club has one or more project 
Each project has one or more operator 
Each operator has one or more countries 
Each country has one or more currency 
+0

suggérer créer un violon afin que nous puissions jouer – maSTAShuFu

+0

sens du violon? – PythonDev

+0

sqlfiddle.com afin que vous puissiez créer votre schéma – maSTAShuFu

Répondre

0

Modifier la gauche se joindre à

SELECT ... 
FROM `billing_transaction` bt 
    LEFT JOIN `customersubscription` cust_sub on bt.`msisdn`=cust_sub.`msisdn` 
    ... 

à une jointure interne:

SELECT ... 
FROM `billing_transaction` bt 
    JOIN `customersubscription` cust_sub on bt.`msisdn`=cust_sub.`msisdn` 
    ... 

Vous êtes laissé se joindre à une table potentiellement énorme (billing_trnsaction) sur lequel vous avez appliqué aucun filtre a grand. Mais quel est le point d'un left join ici? Peut-il y avoir une transaction de facturation sans client?

De même, examinez tous vos JOINS GAUCHE et remplacez-les par des JOINS INTERNE si possible. Appliquez ensuite les filtres de manière appropriée (lorsque cela est possible, un index existe).

+0

Je ne suis pas sûr de savoir lequel joint à la jointure interne et lequel rejoindre à gauche. – PythonDev

+0

Pour commencer, essayez ma suggestion (remplacez le premier LEFT JOIN par JOIN) et dites-nous comment ça se passe. –

+0

ok. Tenez-vous l'essayer – PythonDev