7
votes

Deux requêtes sont rapides séparément, lentement lorsqu'elles sont jointes comme sous-requêtes

J'ai deux questions que chacun, seuls, couragent assez rapidement (moins de 2 secondes). Cependant, lorsque j'essaie de les rejoindre comme sous-requêtes, il court ridiculement lentement. La dernière fois que je le faisais, il a fallu environ 68 secondes. Voici la requête complète: xxx

que cette requête doit fonctionner lentement n'est pas une surprise totale. S'il s'agissait de deux tables distinctes et non de sous-soluies, je mettrais des index sur leur Compte_Number . Cependant, il n'est évidemment pas possible de mettre des index sur les résultats de la requête, donc je ne peux donc pas faire ça. Je soupçonne que cela fait partie du problème.

Mis à part cela, je ne comprends pas pourquoi la requête est lente et que je n'ai aucune idée sur la manière de l'accélérer, autrement que d'ajouter deux tables de synthèse , que je ne veux pas faire si je n'aurais pas besoin.

D'ailleurs, cette requête en anglais pourrait être: "Obtenez toutes les transactions de point de vente (codes 0, 20 et 40) pour comptes qui ne sont pas des comptes de protection de découvert (code O1). "


2 commentaires

S'il vous plaît montrer votre résultat expliquer et votre structure de table


La seconde requête peut-elle dupliquer sur Compte_Number ?


4 Réponses :


0
votes

Il semble probable que MySQL optimise de manière incorrecte la requête en raison de la complexité globale.

Ce que vous pouvez trouver est la meilleure option consiste à l'exécuter en étapes. P>

SELECT * INTO #query1 FROM <query1>
SELECT * INTO #query2 FROM <query2>
SELECT * FROM #query1 INNER JOIN #query2 ON <predicate>


1 commentaires

MySQL n'est pas capable de faire quoi que ce soit, sauf boucles imbriquées .



1
votes

Placez la vérification dans la requête principale:

transaction_code (code)
account_transaction (transaction_code_id)
account_transaction (account_number)


0 commentaires

0
votes

Basé sur ce que je vois de votre requête;

1) semble que votre PK est le numéro de compte sur la table Import_Bundle. Vous avez besoin d'index en cluster sur cette colonne 2) Ajout d'index sur (CODE) Table de Northway_Product et (code) sur la table transaction_code aiderait également.


0 commentaires

0
votes

Étant donné que la plupart de vos tables sont déjà jointes, pourquoi se joindre à nouveau ... juste sur les autres tables où les identifiants sont déjà définis. De plus, étant donné que toutes sont des jointures et aucune ne sont laissées jointes, il est impliqué de recevoir uniquement des enregistrements trouvés dans toutes les joints (puisque votre requête d'origine rejoint également les ensembles de résultats).

En outre, en ajoutant le NP. Code! = '01', il exclut immédiatement ces entrées ne laissant donc que ceux souhaités dans votre requête. Donc, cette "préquicieuse" interne (PQ aliased) fait tout le travail pour vous. Cependant, votre groupe n'inclut pas l'ID d'importation d'importation et peut vous passer d'une fausse réponse. Ajuster si nécessaire. Ensuite, le résultat de cela ne tire-t-il que deux colonnes ... le nombre et le total qui retourneraient plusieurs rangées, mais aucun contexte sur le compte ou les totaux, mais vous pouvez ajuster comme vous le voyez. P>

SELECT PQ.count,
       PQ.total
  FROM (SELECT STRAIGHT_JOIN
            t.account_number,
            COUNT(t.id) count,
            SUM(t.amount) total,
            ib.id import_bundle_Id
         FROM 
            transaction_code tc
               join account_transaction t
                  on tc.id = t.transaction_import_id
               join transaction_import ti
                  on t.transaction_import_id = ti.id
               join generic_import gi
                  on ti.generic_import_id = gi.id
               join import_bundle ib
                  on gi.import_bundle_id = ib.id
               join account_import ai 
                  on gi.id = ai.generic_import_id
               join account a
                  on ai.id = a.account_import_id
               join account_northway_product anp
                  on a.id = anp.account_id
               join northway_product np
                  on anp.northway_product_id = np.id
                  AND np.code != '01'
         where
            tc.code in ( 0, 20, 40 )
         group by 
            t.account_number ) PQ


0 commentaires