Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
В базе данных есть таблица, которая представляет собой очередь сообщений, отсортированных в порядке вставки сообщений в таблицу. Сообщения могут быть двух типов: 'A' и 'B'.
Некий сервис раз в секунду вызывет хранимую процедуру, которая возвращает сервису @n первых сообщений, находящихся в начале очереди (используется top(@n)) и удаляет их.
Требуется, чтобы хранимая процедура возвращала сервису не более @m сообщений в минуту типа 'B', при этом сообщения типа 'A' должны отдаваться сервису без ограничений.

Какие варианты моуг быть для решения этой задачи?
17 авг 11, 10:52    [11131107]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Prolog,

union поможет
17 авг 11, 11:12    [11131269]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prolog
Требуется, чтобы хранимая процедура возвращала сервису не более @m сообщений в минуту типа 'B'

В минуту от чего ? От предыдущего запуска ?
17 авг 11, 11:14    [11131281]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Glory, от текущего запуска отсчитываем назад минуту. Колво-сообщений за эту минуту + то, которое должны отдать сейчас не должно превышать @m.
17 авг 11, 11:26    [11131357]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Prolog
Требуется, чтобы хранимая процедура возвращала сервису не более @m сообщений в минуту типа 'B', при этом сообщения типа 'A' должны отдаваться сервису без ограничений.


select
  *
from [очередь сообщений] a 
where
  a.[тип] = 'A'
  and a.[дата] > dateadd(minute, -1, getdate())
union all
select top ( @m )
  *
from [очередь сообщений] a 
where
  a.[тип] = 'B'
  and a.[дата] > dateadd(minute, -1, getdate())

?

Сообщение было отредактировано: 17 авг 11, 11:32
17 авг 11, 11:31    [11131394]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prolog
Glory, от текущего запуска отсчитываем назад минуту. Колво-сообщений за эту минуту + то, которое должны отдать сейчас не должно превышать @m

Только откуда вы узнаете, сколько записей было выбрано за все запуски на минуту назад ?
17 авг 11, 11:36    [11131441]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Гавриленко Сергей Алексеевич, Общее количество отдаваемых сообщений (и типа 'A' и типа 'B') не должно превышать @n. При этом сообщений типа 'B' должно быть столько среди этих @n, чтобы их общее количество за одну минуту (с учетом предыдущих вызовов) не превышало @m.
17 авг 11, 11:37    [11131449]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А как узнать, сколько было этих предыдущих вызовов и сколько уже отдано этих сообщений B?
17 авг 11, 11:39    [11131466]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Гавриленко Сергей Алексеевич
А как узнать, сколько было этих предыдущих вызовов и сколько уже отдано этих сообщений B?
Предположим, что это логируется, с указанием типа сообщения и времени это забора из очереди.
17 авг 11, 11:40    [11131476]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Prolog
Гавриленко Сергей Алексеевич
А как узнать, сколько было этих предыдущих вызовов и сколько уже отдано этих сообщений B?
Предположим, что это логируется, с указанием типа сообщения и времени это забора из очереди.
Ну и в чем тогда проблема? Выбираем сначала столько B за последнюю минуту, чтобы не превысить значение @m или @n, считаем, сколько выбралось, остальное добиваем сообщениями типа A.
17 авг 11, 11:42    [11131499]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Гавриленко Сергей Алексеевич, Если "остальное добиваем сообщениями типа A", то может так сложиться, что будут выбираться только сообщения 'B' или преимущественно сообщения типа 'B' в ущерб сообщениям типа 'A'.
17 авг 11, 12:11    [11131804]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prolog
Если "остальное добиваем сообщениями типа A", то может так сложиться, что будут выбираться только сообщения 'B' или преимущественно сообщения типа 'B' в ущерб сообщениям типа 'A'.

Вот мы в точке 0 - сколько записей каждого типа должно быть выбрано ?
17 авг 11, 12:16    [11131874]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Prolog
Гавриленко Сергей Алексеевич, Если "остальное добиваем сообщениями типа A", то может так сложиться, что будут выбираться только сообщения 'B' или преимущественно сообщения типа 'B' в ущерб сообщениям типа 'A'.
Тогда наоборот выбирайте, сначала A, потом добивате B.
17 авг 11, 12:17    [11131887]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Товарищ путается в показаниях?

Prolog
при этом сообщения типа 'A' должны отдаваться сервису без ограничений.

Prolog
Общее количество отдаваемых сообщений (и типа 'A' и типа 'B') не должно превышать @n
17 авг 11, 12:30    [11132017]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
SamMan
Товарищ путается в показаниях?

Prolog
при этом сообщения типа 'A' должны отдаваться сервису без ограничений.

Prolog
Общее количество отдаваемых сообщений (и типа 'A' и типа 'B') не должно превышать @n

Да, ошибка хотел написать "без ограничений" по времени. Правильно "общее количество отдаваемых сообщений (и типа 'A' и типа 'B') не должно превышать @n".
17 авг 11, 12:32    [11132043]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prolog
Правильно "общее количество отдаваемых сообщений (и типа 'A' и типа 'B') не должно превышать @n".

Ну так и какова пропорция между типами ?
17 авг 11, 12:33    [11132064]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Гавриленко Сергей Алексеевич
Тогда наоборот выбирайте, сначала A, потом добивате B.


Тогда наоборот, если "потом добивате B", то может так сложиться, что будут выбираться только сообщения 'А' или преимущественно сообщения типа 'А' в ущерб сообщениям типа 'B'.
17 авг 11, 12:35    [11132075]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Prolog
Гавриленко Сергей Алексеевич
Тогда наоборот выбирайте, сначала A, потом добивате B.


Тогда наоборот, если "потом добивате B", то может так сложиться, что будут выбираться только сообщения 'А' или преимущественно сообщения типа 'А' в ущерб сообщениям типа 'B'.
Ну так надо сначала с алгоритмом балансировки определяться, а потом программить, не?
17 авг 11, 12:40    [11132143]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Glory
Ну так и какова пропорция между типами ?
. Нет заранее определенных пропрорций. В одно время могут быть только тип 'A', в другое только тип 'B', а в третье 'A' и 'B' в перемежку с преобладанием то одного, то другого.
17 авг 11, 12:55    [11132309]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prolog
Нет заранее определенных пропрорций. В одно время могут быть только тип 'A', в другое только тип 'B', а в третье 'A' и 'B' в перемежку с преобладанием то одного, то другого.

Тогда почему вы пишите, что не подходит
"Если "остальное добиваем сообщениями типа A", то может так сложиться, что будут выбираться только сообщения 'B' или преимущественно сообщения типа 'B' в ущерб сообщениям типа 'A'."
100% преобладание - это тоже преобладание, которое соблюдает условие "Нет заранее определенных пропрорций"
17 авг 11, 12:58    [11132341]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Гавриленко Сергей Алексеевич
Ну так надо сначала с алгоритмом балансировки определяться, а потом программить, не?
Есть такое требование: "общее количество отдаваемых сообщений (и типа 'A' и типа 'B') не должно превышать @n. При этом сообщений типа 'B' должно быть столько среди этих @n, чтобы их общее количество за одну минуту (с учетом предыдущих вызовов) не превышало @m". Какой для него алгоритм балансировки? Или требование сформулировано не вполне корректно?
17 авг 11, 13:04    [11132413]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Prolog
Гавриленко Сергей Алексеевич
Ну так надо сначала с алгоритмом балансировки определяться, а потом программить, не?
Есть такое требование: "общее количество отдаваемых сообщений (и типа 'A' и типа 'B') не должно превышать @n. При этом сообщений типа 'B' должно быть столько среди этих @n, чтобы их общее количество за одну минуту (с учетом предыдущих вызовов) не превышало @m". Какой для него алгоритм балансировки? Или требование сформулировано не вполне корректно?
Тогда к чему ваши "то может так сложиться, что будут выбираться только сообщения 'B' или преимущественно сообщения типа 'B' в ущерб сообщениям типа 'A'"? Это не противоречит требованию.
17 авг 11, 13:06    [11132436]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
Prolog
Есть такое требование: "общее количество отдаваемых сообщений (и типа 'A' и типа 'B') не должно превышать @n. При этом сообщений типа 'B' должно быть столько среди этих @n, чтобы их общее количество за одну минуту (с учетом предыдущих вызовов) не превышало @m". Какой для него алгоритм балансировки? Или требование сформулировано не вполне корректно?

Точка 0
У меня миллион записей типа А и миллион записей типа В
@m = 100
Сколька записей А и В должен выбрать запрос ?
17 авг 11, 13:07    [11132442]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Предположим в таблице очередей записи расположены следующим образом:

001-050 - Записи типа 'A'
051-070 - Записи типа 'B'
071-080 - Записи типа 'A'
081-180 - Записи типа 'B'
181-300 - Записи типа 'А'

Пусть @n=100, @m=100

A. Если в момент вызова процедуры за предыдущую минуту было отправлено 0 записей типа 'B'.
Процедура должна вернуть следующие 100 записей:
001-050 50 записей типа 'A'
051-070 20 записей типа 'B'
071-080 10 записей типа 'A'
081-100 20 записей типа 'B'


B. Если в момент вызова процедуры за предыдущую минуту было отправлено 95 записей типа 'B'.
Процедура должна вернуть следующие 100 записей:
001-050 50 записей типа 'A'
051-055 5 записей типа 'B' (056-070 остаются на будующее)
071-080 10 записей типа 'A'
(081-180 остаются на будующее)
181-215 35 записей типа 'A'

С. Если в момент вызова процедуры за предыдущую минуту было отправлено 150 записей типа 'B'.
Процедура должна вернуть следующие 100 записей:
001-050 50 записей типа 'A'
(056-070 остаются на будующее)
071-080 10 записей типа 'A'
(081-180 остаются на будующее)
181-220 40 записей типа 'A'

Записи типа 'A' и 'B' расположены в таблице вперемежку, но упорядочены в порядке их вставки в таблицу. Выбирать нужно @n записей в порядке их вставки в таблицу. При этом среди этих отобранных @n записей количество записей типа 'B' должно быть столько, чтобы количество отобранных записей 'B' в сумме с количеством отобранных записей 'B' при вызовах процедуры за предыдущую 1 минуту (60 секунд) не превышало не превышало @m.
17 авг 11, 15:06    [11133647]     Ответить | Цитировать Сообщить модератору
 Re: Обрабатываем очередь с ограничением по времени  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
?
;with a
(
 select top (@m)
  dt
  [type],
  0 as [order]
 from
  t
 where
  [type] = 'B' and
  dt between <минуту назад> and <сейчас>
 order by
  dt
),
b as
(  
 select top (@n)
  dt
  [type],
  1 as [order]
 from
  t
 where
  [type] = 'A' or
  ([type] = 'B' and dt not between <минуту назад> and <сейчас>)
 order by
  dt
),
c as
(
 select dt, [type], [order] from a
 union all
 select dt, [type], [order] from b
)
select top (@n)
 [type], [order] 
from
 c
order by
 [order], dt;
 
17 авг 11, 16:38    [11134443]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить