Вопрос

Короче говоря, у меня есть 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

Я предполагаю, что это сканирование таблицы, поскольку у вас нет зависимых подзапросов.Чтобы убедиться, запустите объяснение запроса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top