Итерация 150 тыс. записей с 5 столбцами через тип объекта в контейнере цикла foreach в SSIS с хранимой процедурой занимаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Итерация 150 тыс. записей с 5 столбцами через тип объекта в контейнере цикла foreach в SSIS с хранимой процедурой занима

Сообщение Anonymous »

У меня есть вариант использования, когда мне нужно просмотреть все строки таблицы и применить некоторые преобразования (а также обновления) к каждой строке.
Ниже показано, как я это делаю. сейчас:
  • Создал переменную типа объекта и извлек в нее все 150 тыс. строк данных из таблицы, используя полный набор результатов с помощью «Выполнить задачу SQL» (это имеет 4 столбца)
  • Использовал контейнер цикла foreach для итерации каждой строки, полученной на шаге 1.
  • Внутри контейнера цикла foreach снова использовал команду «Выполнить» Задача SQL", где я вызываю хранимую процедуру с четырьмя столбцами строки в качестве параметров.
ПРИМЕЧАНИЕ. Хранимая процедура имеет несколько проверок и одно обновление. оператор, который будет выполняться для всех 150 тысяч записей.
Проблема в том, что обработка всех 150 тысяч строк занимает почти 3,5 часа, и это может быть неприемлемо, поскольку мне, возможно, придется запускайте этот процесс не реже одного раза в 2 часа.
Я также пытался использовать задачу сценария и внутри задачи сценария перебирать значение объекта с помощью ADO.NET, но затраченное время почти те же 3+ часа.
Кроме того, таблица, содержащая 150 тыс. строк, не имеет идентификатора первичного ключа.
Пожалуйста, помогите, как я могу улучшить производительность этого процесса.
Подробности: ниже представлена ​​задача «Выполнение SQL», которая извлекает 4 столбца из таблицы со 150 тысячами записей и сохраняет их в переменной типа объекта.

Код: Выделить всё

select aa, bb, cc, dd
from xxxx;
(скажем, таблица xxxx содержит 150 000 строк для обработки)
[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
И весь процесс занимает более 3 часов для обработки 150 тыс. записей

Подробнее здесь: https://stackoverflow.com/questions/787 ... reach-loop
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Итерация 150 тыс. записей с 5 столбцами через тип объекта в контейнере цикла foreach в SSIS с помощью хранимой процедуры
    Anonymous » » в форуме C#
    0 Ответы
    114 Просмотры
    Последнее сообщение Anonymous
  • Динамическое создание моделей DTO на основе данных, возвращаемых хранимой процедурой.
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • ASP.NET C#: SqlDataSource с хранимой процедурой и параметрами
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • CakePHP с хранимой процедурой
    Anonymous » » в форуме Php
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Нужны рекомендации о том, какой инструмент подходит для создания приложения/веб-сайта, в зависимости от того, что занима
    Anonymous » » в форуме Android
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»