Ниже показано, как я это делаю. сейчас:
- Создал переменную типа объекта и извлек в нее все 150 тыс. строк данных из таблицы, используя полный набор результатов с помощью «Выполнить задачу SQL» (это имеет 4 столбца)
- Использовал контейнер цикла foreach для итерации каждой строки, полученной на шаге 1.
- Внутри контейнера цикла foreach снова использовал команду «Выполнить» Задача SQL", где я вызываю хранимую процедуру с четырьмя столбцами строки в качестве параметров.
Проблема в том, что обработка всех 150 тысяч строк занимает почти 3,5 часа, и это может быть неприемлемо, поскольку мне, возможно, придется запускайте этот процесс не реже одного раза в 2 часа.
Я также пытался использовать задачу сценария и внутри задачи сценария перебирать значение объекта с помощью ADO.NET, но затраченное время почти те же 3+ часа.
Кроме того, таблица, содержащая 150 тыс. строк, не имеет идентификатора первичного ключа.
Пожалуйста, помогите, как я могу улучшить производительность этого процесса.
Подробности: ниже представлена задача «Выполнение SQL», которая извлекает 4 столбца из таблицы со 150 тысячами записей и сохраняет их в переменной типа объекта.
Код: Выделить всё
select aa, bb, cc, dd
from xxxx;
[img]https://i .sstatic.net/H34MsxAO.png[/img]
Затем я использую этот контейнер цикла foreach для перебора каждой строки из 150 000 строк в таблице xxxx


Теперь я использую «Выполнение задачи SQL» для вызова хранимой процедуры, которая содержит логика; хранимая процедура принимает 4 параметра и обрабатывает их построчно, пока цикл foreach не исчерпается.
[img]https://i. sstatic.net/lNy4V69F.png[/img]
Хранимая процедура выглядит примерно так
Код: Выделить всё
CREATE PROCEDURE [Omg].[validateError]
@DID varchar(50),
@MGN varchar(100),
@MN varchar(50),
@SN varchar(20)
AS
DECLARE @IsValidxx bit = 0,
@IsValidyy bit = 0,
@IsValidzz bit = 0,
@IsValidww bit = 0,
@HoldErrorCodes varchar(20) = 'Z',
@InValidxxrErrorCode varchar(20) = 'D',
@InValidyyErrorCode varchar(20) = 'A',
@InValidzzErrorCode varchar(20) = 'M',
@InValidwwErrorCode varchar(20) = 'G';
BEGIN
BEGIN TRY
SET @IsValidxx = CASE
WHEN EXISTS(SELECT 1 FROM aaaaaaaa WHERE DID = @DID AND TerritoryType = 'Level 1')
THEN 1
ELSE 0
END;
SET @IsValidyy = CASE
WHEN EXISTS (SELECT 1
FROM bbbbbbb OFM
INNER JOIN ccccccc MG ON MG.Ordf = OFM.Ordf
INNER JOIN ddddddddd M ON M.Mod = MG.Mod
AND M.Available = 1
AND MG.IsActive = 1
AND M.MN = @MN
AND MG.MGN = @MGN)
THEN 1
ELSE 0
END;
IF @IsValidyy = 1
BEGIN
SET @IsValidzz = 1;
SET @IsValidww = 1;
END
ELSE
BEGIN
SET @IsValidzz = CASE WHEN EXISTS(SELECT 1 FROM dddddd WHERE MN = @MN AND SN=@SN AND Available=1 ) THEN 1 ELSE 0 END;
SET @IsValidww= CASE WHEN EXISTS(SELECT 1 FROM ccccc] WHERE MGN = @MGN AND IsActive=1) THEN 1 ELSE 0 END;
END
IF @IsValidxx = 1 AND @IsValidyy = 1 AND
@IsValidzz = 1 AND @IsValidww = 1
BEGIN
SET @IsValidxx = 1;
SET @IsValidyy = 1;
SET @IsValidzz = 1;
SET @IsValidww = 1;
END
ELSE
IF @IsValidxx = 0
BEGIN
SET @HoldErrorCodes = @HoldErrorCodes + @InValidxxrErrorCode;
END
IF @IsValidyy = 0
BEGIN
SET @HoldErrorCodes = @HoldErrorCodes + @InValidyyErrorCode;
END
IF @IsValidzz = 0
BEGIN
SET @HoldErrorCodes = @HoldErrorCodes + @InValidzzErrorCode;
END
IF @IsValidww = 0
BEGIN
SET @HoldErrorCodes = @HoldErrorCodes + @InValidwwErrorCode;
END
UPDATE [Import].[Recommendation]
SET ErrorCodes = @HoldErrorCodes
WHERE DID = @DID
AND MN = @MN
AND MGN = @MGN
AND SN = @SN;
END TRY
BEGIN CATCH
RETURN ERROR_MESSAGE() ;
END CATCH
Подробнее здесь: https://stackoverflow.com/questions/787 ... reach-loop