0
votes

Filtrer la même requête 3 fois différents. Performance?

J'ai une requête qui est vraiment lente. Je posterai du pseudo code ici.

SELECT 
    ListofDates.Date as Event,
    (SELECT COUNT(DISTINCT TableofExtensiveJoins1.ID)
     FROM TableofExtensiveJoins1)
    WHERE Event=TableofExtensiveJoins1.Date AND Condition1
   (SELECT COUNT(DISTINCT TableofExtensiveJoins2.ID)
    FROM TableofExtensiveJoins2
    WHERE Event = TableofExtensiveJoins2.Date AND Condition2)
   (SELECT COUNT(DISTINCT TableofExtensiveJoins3.ElementID)
    FROM TableofExtensiveJoins3
    WHERE Event = TableofExtensiveJoins3.Date AND Condition3)
FROM
    ListOfDates


3 commentaires

Exemple de données Les résultats souhaités vous donneraient de meilleures chances d'avoir une bonne réponse. Veuillez lire les premiers paragraphes de la info TSQL Tag et Modifier Votre question en conséquence.


Vous pouvez essayer d'utiliser la déclaration avec


Voulez-vous une solution pseudo ou une solution de travail? Veuillez fournir DDL + DML + Exemple de requête que vous souhaitez améliorer


3 Réponses :


0
votes

Essayez l'agrégation conditionnelle, une sorte de xxx


0 commentaires

0
votes

Le ci-dessous doit fonctionner mieux car il n'évalue que tableOffensancljoinages code> une seule fois et n'a besoin que d'une opération pour obtenir le nombre distinct

WITH DistCounts
     AS (SELECT COUNT(DISTINCT ID) AS DistCount,
                condition_flag,
                Date
         FROM   TableofExtensiveJoins
                CROSS APPLY (SELECT 1 WHERE  Condition1
                             UNION ALL
                             SELECT 2 WHERE  Condition2
                             UNION ALL
                             SELECT 3 WHERE  Condition3) CA(condition_flag)
         GROUP  BY condition_flag,
                   Date),
     Pivoted
     AS (SELECT Date,
                MAX(CASE WHEN condition_flag = 1 THEN DistCount END) AS DistCount1,
                MAX(CASE WHEN condition_flag = 2 THEN DistCount END) AS DistCount2,
                MAX(CASE WHEN condition_flag = 3 THEN DistCount END) AS DistCount3
         FROM   DistCounts
         GROUP  BY Date)
SELECT lod.Date as Event,
        DistCount1,
        DistCount2,
        DistCount3
from ListOfDates lod
left join Pivoted p on lod.Date=p.Date


0 commentaires

0
votes

Je pense que vous voulez externe s'appliquer code>: xxx pré>

supposant que tej.id code> est unique, vous n'avez pas besoin du Nombre (distinct) code>. Cependant, si vous faites: p>

SELECT lod.Date as Event, tej.*
From ListOfDates lod OUTER APPLY
     (SELECT COUNT(DISTINCT CASE WHEN <condition 1> THEN tej.ID END) as col1,
             COUNT(DISTINCT CASE WHEN <condition 2> THEN tej.ID END) as col2,
             COUNT(DISTINCT CASE WHEN <condition 3> THEN tej.ID END) as col3
      FROM TableofExtensiveJoins tej
      WHERE lod.Event = tej.Date
     ) tej;


4 commentaires

Merci. C'est un bon point de départ qu'il semble. Je n'ai qu'un seul problème. Je veux que la condition soit dépendante sur LOD. Mais les références intérieures et extérieures ne sont pas autorisées. Avez-vous une idée de la façon de contourner cela?


@ODATAS. . . Ces deux ces deux appuient cette fonctionnalité. C'est pourquoi j'ai répondu avec appliquer .


Mais je reçois une erreur de la fonction agrégée: "Plusieurs colonnes sont spécifiées dans une expression agrégée contenant une référence extérieure. Si une expression étant agrégée contient une référence extérieure, cette référence extérieure doit être la seule colonne référencée dans l'expression."


@ODATAS. . . C'est difficile à réparer sans voir le code - vous devriez peut-être poser une autre question. Vous devez séparer les conditions corrélation (ceux qui relient les tables internes et extérieures à partir des conditions Aggregation .