Лучший способ подсчитать эти данные
-
05-07-2019 - |
Вопрос
Короче говоря, у меня есть 2 таблицы:
ПОЛЬЗОВАТЕЛИ:
------------------------
UserID | Name
------------------------
0 a
1 b
2 c
CALLS:
------------------------
ToUser | Result
------------------------
0 ANSWERED
1 ENGAGED
1 ANSWERED
0 ANSWERED
И т. д. и т. п. (я использую цифровую ссылку на реальный результат)
У меня более 2 миллионов записей, каждая из которых подробно описывает звонок конкретному клиенту.В настоящее время я использую операторы Case для подсчета каждого повторения определенного результата ПОСЛЕ того, как я уже выполнил быстрый общий подсчет:
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]
Делаю ли я 3 сканирования данных после первоначального общего подсчета?если да, то есть ли способ выполнить одну проверку и подсчитать звонки в соответствии с результатом за один раз?
Спасибо.
Решение
Для этого потребуется одно полное сканирование таблицы.
РЕДАКТИРОВАТЬ:Недостаточно информации для ответа;поскольку удаление дубликатов (DISTINCT), которое я пропустил ранее, мы не можем сказать, какая стратегия будет использоваться....особенно не зная механизма базы данных.
Практически во всех основных механизмах запросов каждая агрегатная функция выполняется для каждого столбца в каждой строке и может использовать кэшированный результат (например, COUNT(*)).
Индексируется ли line_result?Если да, то вы могли бы использовать более удобный запрос (GROUP BY + COUNT(*)), чтобы воспользоваться статистикой индекса, хотя я не уверен, стоит ли это того, в зависимости от других ваших таблиц в запросе.
Другие советы
Здесь GROUP BY
конструкция в SQL.Пытаться:
SELECT COUNT(DISTINCT l_call_log.line_id)
GROUP BY l_call_log.line_result
Я предполагаю, что это сканирование таблицы, поскольку у вас нет зависимых подзапросов.Чтобы убедиться, запустите объяснение запроса.