Лучший способ посчитать эти данные - PullRequest
0 голосов
/ 11 сентября 2009

Короче у меня 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 сканирования данных после общего начального подсчета? если это так, есть ли способ, которым я могу сделать одну проверку и подсчитать количество вызовов за результат за один раз?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 11 сентября 2009

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

0 голосов
/ 11 сентября 2009

Это займет одно полное сканирование таблицы.

РЕДАКТИРОВАТЬ : недостаточно информации, чтобы ответить; потому что удаление дубликатов (DISTINCT), которое я пропустил ранее, мы не можем сказать, какую стратегию можно использовать .... особенно без знания механизма базы данных.

Практически во всех основных обработчиках запросов каждая агрегатная функция выполняется для каждого столбца в каждой строке и может использовать кэшированный результат (например, COUNT (*)).

Индексируется ли line_result? Если это так, вы можете использовать лучший запрос (GROUP BY + COUNT (*), чтобы воспользоваться статистикой индекса, хотя я не уверен, стоит ли это зависеть от других ваших таблиц в запросе.

0 голосов
/ 11 сентября 2009

В SQL существует конструкция GROUP BY. Попробуйте:

SELECT COUNT(DISTINCT l_call_log.line_id)
  GROUP BY l_call_log.line_result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...