Обработка повторяемого подмножества записей в таблице SQL Server 2000 - PullRequest
1 голос
/ 29 июля 2010

У меня есть сценарий, который обрабатывает записи в очереди в таблице SQL в SQL Server 2000. Теперь мне нужно добавить дополнительные экземпляры моего сценария для обработки их собственного подмножества записей в очереди в таблице.

Как я могу запросить таблицу в каждом экземпляре, чтобы каждый экземпляр возвращал подмножество строк, которые никогда не пересекаются друг с другом?

Я мог бы запросить в строке идентификатора нечетные числа в одном процессе и четные числа в другом, но в конечном итоге мне нужно будет добавить более 2 экземпляров.

CREATE TABLE requests (
   id int IDENTITY(1,1) NOT NULL,
   requestor VARCHAR(50),
   status INT,
   created DATETIME,
   queuetime DATETIME
)

Существующий запрос для одного экземпляра:

SELECT * FROM requests WHERE status = 1 ORDER BY queuetime

Ответы [ 2 ]

1 голос
/ 29 июля 2010

Похоже, вы хотите, чтобы 2+ процессора обрабатывали записи из таблицы requests.

Можете ли вы добавить столбец в таблицу requests, чтобы указать, что он обработан?Другими словами, вы хотите следить за тем, чтобы он был «взят» и «закончен».Возможно, закончено в этом случае, может быть, вы удаляете записи из таблицы.Поэтому просто добавьте столбец, такой как ProcessingOn DATETIME.

. С помощью этой конструкции вы можете иметь каждый процессор SELECT в своем пакете, но, конечно же, убедитесь, что он не принимает тот, который уже находится вprocess '.

BEGIN TRAN

DECLARE @RecordsToProcess TABLE (ID int)

--grab our candidates
INSERT INTO @RecordsToProcess (ID) 
     SELECT ID FROM requests WHERE status = 1 
     AND ProcessingOn IS NULL ORDER BY queuetime

--mark our batch of records as 'in-process'.
UPDATE requests SET ProcessingOn = CURRENT_TIMESTAMP 
WHERE ID IN (SELECT ID FROM @RecordsToProcess)

--get all those records to process.
SELECT * FROM requests 
WHERE ID IN (SELECT ID FROM @RecordsToProcess)


COMMIT TRAN

Тогда вы, скорее всего, столкнетесь с ситуацией, когда пакет не прошел.В этом случае записи никогда не удаляются, но их ProcessingOn не равно нулю.Возможно, установите допуск повторных попыток в SELECT, при котором пороговое значение (возможно, 5 минут, возможно, 1 день, все, что вам нужно) используется для оценки необходимости повторной обработки этих записей.

   --grab our candidates
INSERT INTO @RecordsToProcess (ID) 
     SELECT ID FROM requests WHERE status = 1 
     AND (ProcessingOn IS NULL OR ProcessingOn < DATEADD(day, -1, ProcessingOn) 
     ORDER BY queuetime
1 голос
/ 29 июля 2010

Исходя из вашего нечетного / четного решения, кажется, что не имеет значения, в какой последовательности обрабатываются запросы. Так что, может быть, вы могли бы сделать что-то вроде этого.

SELECT id, requestor, status, created, queuetime
FROM requests
WHERE status = 1
    AND ID % 3 + 1 = 2
ORDER BY queuetime

3 во втором условии представляет количество процессов. Число 2 указывает на 2-й процесс.

...