Il modo migliore per contare questi dati
-
05-07-2019 - |
Domanda
In breve ho 2 tabelle:
Gli utenti:
------------------------
UserID | Name
------------------------
0 a
1 b
2 c
CALLS:
------------------------
ToUser | Result
------------------------
0 ANSWERED
1 ENGAGED
1 ANSWERED
0 ANSWERED
Ecc., ecc. (utilizzo un riferimento numerico per il risultato nella realtà)
Ho oltre 2 milioni di record ciascuno dei quali dettaglia una chiamata a un cliente specifico. Attualmente sto usando le dichiarazioni Case per contare ogni ripetizione di un particolare risultato DOPO aver già eseguito il conteggio totale rapido:
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]
Sto eseguendo 3 scansioni dei dati dopo il conteggio totale iniziale? in tal caso, esiste un modo per eseguire una scansione e contare le chiamate di conseguenza in una volta sola?
Grazie.
Soluzione
Questo richiederebbe una scansione completa della tabella.
MODIFICA : non ci sono abbastanza informazioni per rispondere; perché la rimozione duplicata (DISTINCT) che mi mancava prima, non possiamo dire quale strategia sarebbe stata usata .... soprattutto senza conoscere il motore di database.
In quasi tutti i principali motori di query, ogni funzione aggregata viene eseguita per ogni colonna per ogni riga e può utilizzare un risultato memorizzato nella cache (come COUNT (*) per esempio).
Line_result è indicizzato? In tal caso, potresti sfruttare una query migliore (GROUP BY + COUNT (*) per sfruttare le statistiche dell'indice, anche se non sono sicuro che valga la pena dipendere dalle altre tue tabelle nella query.
Altri suggerimenti
Esiste la costruzione GROUP BY
in SQL. Prova:
SELECT COUNT(DISTINCT l_call_log.line_id)
GROUP BY l_call_log.line_result
Immagino che sia una scansione della tabella, dal momento che non hai subquery dipendenti. Esegui spiegare la query per essere sicuri.