Question

En bref, j'ai 2 tables:

UTILISATEURS:

------------------------
UserID   |   Name
------------------------
0     a
1     b
2     c

CALLS:
------------------------
ToUser   |   Result
------------------------
0     ANSWERED
1     ENGAGED
1     ANSWERED
0     ANSWERED

Etc, etc. (j'utilise une référence numérique pour obtenir un résultat réel)

J'ai plus de 2 millions d'enregistrements, chacun détaillant un appel à un client spécifique. J'utilise actuellement les instructions de cas pour compter chaque récurrence d'un résultat particulier APRÈS avoir déjà effectué le décompte total rapide:

COUNT(DISTINCT l_call_log.line_id),
COALESCE (SUM(CASE WHEN l_call_log.line_result = 1 THEN 1 ELSE NULL END), 0) AS [Answered],
COALESCE (SUM(CASE WHEN l_call_log.line_result = 2 THEN 1 ELSE NULL END), 0) AS [Engaged], 
COALESCE (SUM(CASE WHEN l_call_log.line_result = 4 THEN 1 ELSE NULL END), 0) AS [Unanswered]

Est-ce que je fais 3 scans des données après mon décompte total initial? Si oui, y a-t-il un moyen de faire un balayage et de compter les appels comme résultat par résultat en une fois?

Merci.

Était-ce utile?

La solution

Ceci prendrait une analyse complète de la table.

MODIFIER : il n'y a pas assez d'informations pour répondre; En raison de la suppression des doublons (DISTINCT) que j’avais manquée plus tôt, nous ne pouvons pas dire quelle stratégie serait utilisée .... surtout sans connaître le moteur de base de données.

Dans à peu près tous les principaux moteurs de requêtes, chaque fonction d'agrégat est exécutée pour chaque colonne et pour chaque ligne. Elle peut utiliser un résultat mis en cache (tel que COUNT (*), par exemple).

Est-ce que line_result est indexé? Si tel est le cas, vous pouvez utiliser une meilleure requête (GROUP BY + COUNT (*) pour tirer parti des statistiques d'index, bien que je ne sache pas si cela vaut la peine de dépendre de vos autres tables dans la requête.

Autres conseils

Il existe la construction GROUP BY en SQL. Essayez:

SELECT COUNT(DISTINCT l_call_log.line_id)
  GROUP BY l_call_log.line_result

Je suppose qu’il s’agit d’un scan de table car vous n’avez aucune sous-requête dépendante. Exécutez expliquez sur la requête pour être sûr.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top