Масштабируемый и эффективный способ выполнения расчетов с базой данных - PullRequest
2 голосов
/ 11 марта 2010

Многопользовательская база данных для использования агентами по продажам, таблица содержит потенциальных клиентов для вызова. Одна запись отображается для оператора за один раз, чтобы он мог позвонить, после вызова агент обновляет запись с помощью закодированного результата вызова, взятого из таблицы результатов. В этой таблице некоторые результаты имеют время перезапуска, после которого запись должна отображаться оператору (любому оператору) для повторного вызова. На практике 80% звонков приведут к такой переработке записи. Также есть проверка ограничения общего количества звонков, общего количества дней звонков и общего количества звонков за один день. Агенты также могут указать, что они должны сами отозвать запись в установленную дату и время.

Чертеж схемы для иллюстрации

Проспект стол
PK
{контактные данные}
{XML поля для включения настраиваемых полей}
исход последнего звонка
дата последнего звонка
общее время называется
время называется сегодня
record_in_use_flag
(Я подумываю о том, чтобы клиентский интерфейс просто обновлял эту таблицу, обновляя информацию о перспективах, исходящие данные вызовов и агента, а затем триггер обновляет время, называемое полями / датой вызова, а также обновляет таблицу вызовов.)

Таблица вызовов
PK
ФК проспекту ПК
исход вызова
дата звонка
агент называется
(Агенты могут обновить запись перспективы, эти изменения не отслеживаются, но запись вызова и результата сохраняется)

Таблица результатов
код результата (PK)
время перезарядки в минутах

Таблица запланированных обратных вызовов
PK
ФК проспекту ПК
Дата и время
агент

Мой вопрос

Каков наиболее эффективный способ выбора записей, которые следует вызывать следующим, которые будут масштабироваться лучше всего? Я уже решил сохранить информацию о последнем звонке и некоторую вычисленную информацию (количество звонков и т. Д.) В таблице проспекта, поэтому присоединение к таблице звонков не требуется.

a) Если каждый запрос базы данных на записи добавляет время повторения исхода вызова к дате последнего вызова, а затем фильтрует ТОП 1 (думаю, это будет слишком медленно)

b) Должен ли я создать еще одну таблицу с проспектом PK, с указанием даты и времени соответствующего вызова для каждой записи в таблице проспекта, которую необходимо вызвать повторно. Может обновить это:

1) отдельная процедура, которая, скажем, запускалась каждые 10 минут? Результаты, в которых время перезарядки изменилось, необходимо пересчитать

2) в триггере таблицы перспективы, который запускается после обновления результата. Результаты, в которых время перезарядки изменилось, необходимо пересчитать (Эта новая таблица будет обновлена, если время повторного использования для результата изменилось)

1 Ответ

1 голос
/ 11 марта 2010

Проблема, с которой я столкнулся в такой ситуации, заключается в том, что два оператора не решают сделать один и тот же вызов. Так что предложение OUTPUT может помочь.

Вы можете создать функцию, которая будет обрабатывать время следующего вызова, а затем использовать предложение OUTPUT, чтобы вернуть подробности вызова оператору.

Что-то вроде:

UPDATE c SET NextCallTime = dbo.GetNextCallTime(CallID)
OUTPUT deleted.* --Which returns the copy of the row before the change is made
FROM 
(SELECT TOP 1 * FROM Calls ORDER BY NextCallTime) c
;

Мне не нравится поддерживать скалярные функции, но в этом сценарии это сработает, потому что вы вызываете его только один раз. Поместите комментарии в функцию, чтобы было очень ясно, что она никогда не будет вызываться в предложении ORDER BY или в предложении WHERE и т. Д.

Преимущество использования предложения OUTPUT заключается в том, что он возвращает ту строку, которая изменяется, поэтому ее можно передать только одному оператору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...