Pergunta

Em suma, tenho 2 tabelas:

USUÁRIOS:

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

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

Etc, etc (eu uso uma referência numérica para resultado na realidade)

Tenho mais de 2 milhões de registros, cada um detalhando uma chamada para um cliente específico. Atualmente, estou usando declarações de caso para contar cada recepção de um resultado específico depois de já ter feito a contagem total rápida:

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]

Estou fazendo 3 varreduras dos dados após minha contagem total inital? Em caso afirmativo, existe uma maneira de fazer uma varredura e contar as chamadas como resultante de uma só vez?

Obrigado.

Foi útil?

Solução

Isso levaria uma varredura de mesa completa.

EDITAR: Não há informações suficientes para responder; Como a remoção duplicada (distinta) que eu perdi anteriormente, não podemos dizer qual estratégia seria usada ... especialmente sem conhecer o mecanismo de banco de dados.

Em quase todos os principais mecanismos de consulta, cada função agregada é executada por cada coluna por cada linha e pode usar um resultado em cache (como a contagem (*), por exemplo).

Line_result está indexado? Nesse caso, você pode aproveitar uma consulta melhor (grupo de + contagem (*) para aproveitar as estatísticas do índice, embora não tenha certeza se isso vale a pena, dependendo das outras tabelas da consulta.

Outras dicas

Existe o GROUP BY Construção em SQL. Tentar:

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

Eu acho que é uma varredura de mesa, já que você não tem subconsivas dependendo. Run Explique na consulta para ter certeza.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top