Мне нужно обрабатывать строки в таблице партиями не менее чем N строк.Каждый пакет должен содержать целую группу строк (группа - это просто еще один столбец), т. Е. Когда я выбираю верхние N строк в таблице для обработки, мне нужно расширить это N, чтобы охватить последнюю группу в пакете, а не разбивать последнюю группумежду партиями.
Пример данных:
CREATE TABLE test01 (id INT PRIMARY KEY CLUSTERED IDENTITY(1, 1) NOT NULL
, person_name NVARCHAR(100)
, person_surname NVARCHAR(100)
, person_group_code CHAR(2) NOT NULL);
INSERT INTO
dbo.test01 (person_name
, person_surname
, person_group_code)
VALUES
('n1', 's1', 'g1')
, ('n2', 's2', 'g1')
, ('n3', 's3', 'g1')
, ('n4', 's4', 'g1')
, ('n5', 's5', 'g2')
, ('n6', 's6', 'g2')
, ('n7', 's7', 'g2')
, ('n8', 's8', 'g2')
, ('n9', 's9', 'g2')
, ('n10', 's10', 'g2')
, ('n11', 's11', 'g3')
, ('n12', 's12', 'g3')
, ('n13', 's13', 'g3')
, ('n14', 's14', 'g3');
Моя текущая попытка:
DECLARE @batch_start INT = 1
, @batch_size INT = 5;
DECLARE @max_id INT = (SELECT MAX(id) FROM dbo.test01);
WHILE @batch_start <= @max_id
BEGIN
SELECT *
FROM dbo.test01
WHERE id BETWEEN @batch_start AND @batch_start + @batch_size - 1;
SELECT @batch_start += @batch_size;
END;
DROP TABLE dbo.test01;
В приведенном выше примере я разделяю 14 строк на 3 пакета: 5строк в пакете № 1, еще 5 строк в пакете № 2 и затем 4 строки в конечном пакете.
Первый пакет (идентификатор от 1 до 5) охватывает только часть группы 'g2', поэтому мне нужнорасширить эту партию, чтобы она покрывала строки 1-10 (мне нужно обработать весь g2 в одной партии).
(кстати, я не против увеличения размера партии - мне нужно убедиться, что я покрываюпо крайней мере, одна полная группа на партию).
В результате партия № 1 будет охватывать группы g1 и g2 (10 строк), тогда партия № 2 будет охватывать группу g3 (4 строки) и не будетпартия №3 вообще.
Теперь таблица составляет миллиардыколичество строк и пакетов составляет около 50–100 тыс., поэтому мне нужно решение, которое хорошо работает.
Есть ли какие-либо советы о том, как подойти к этому с минимальным ударом по производительности?