1

Недавно мы преобразовали нашу систему JD Edwards EnterpriseOne и платформу AS400/DB2 в Windows & SQL Server. В старой системе у нас была программа RPG/CL, которая передавала данные из библиотеки AS400 в систему учета для дальнейшей обработки. Конечным пользователям необходимо было инициировать этот процесс, чтобы он выполнялся с помощью команды меню.Улучшение производительности передачи данных AS400/SQL Server 2008 R2

Чтобы воспроизвести это поведение после преобразования, я создал хранимую процедуру в SQL Server 2008 R2, которая вставляет записи в базу данных SQL Server из as400 через связанный сервер, а затем обновляет записи на as400, чтобы указать, что записи были обработаны. Чтобы позволить конечным пользователям возможность выполнить этот процесс, я создал отчет SSRS (2005), который выполняет хранимую процедуру.

Когда отчет SSRS выполняется в интерактивном режиме, мы периодически получаем сообщение об ошибке «Для обеспечения безопасности DTD в этом документе XML запрещен», что из-за моего исследования вызвано нехваткой памяти SSRS.

Кто-нибудь знает о другом/лучшем способе передачи данных?

Передача/обновление хранимых процедур по существу

INSERT INTO [SQL DEST TABLE] 
    SELECT * 
    FROM [AS400 Linked Server/Table] 

UPDATE OPENQUERY (AS400_LINK, 'MY SELECT QUERY') 
SET FLAG = PROCESSED; 
+0

Отчет SSRS выглядит как действительно странное место, чтобы поместить логику для обновления вашей базы данных! Я бы использовал либо пакет служб SQL Server Integration Services (SSIS), либо даже SQL-агент, выполняющий некоторые основные инструкции T-SQL по желанию пользователя. –

+0

SSRS был взломан, SSIS был моим первым выбором. Как еще я могу, чтобы конечные пользователи выполняли пакет SSIS без прямого доступа? –

+0

Вы должны иметь возможность хранить пакет SSIS на сервере, запланировать его в задании агента SQL Server, и такое задание может быть выполнено, например. веб-сайт ASP.NET или что-то в этом роде. –

ответ

0

Вы должны получить более высокую производительность базы данных может позволить серверу выполнять работу с его собственными данными, где это возможно, вместо того, чтобы передать его обратно и вперед.

Я сделаю несколько догадок об обстоятельствах, и, если вы исправите меня, я с радостью отрегулирую ответ, чтобы он соответствовал вашей ситуации. Это похоже на то, что вы извлекаете данные из таблицы транзакций учета в DB2, и когда это будет сделано, вы хотите обновить флаг в тех же самых записях. Это может указывать на то, что записи могут оставаться в этой таблице навсегда, или, возможно, что какой-то другой процесс очистит их. В вашем SELECT нет ГДЕ, поэтому я предполагаю, что они удаляются. Я предполагаю, что мы не знаем, можно ли в любое время добавить в таблицу транзакций больше записей, включая любой период между извлечением информации и обновлением флага.

Интересно, можете ли вы обновить флаг сразу после извлечения, прежде чем они фактически обработали SQL Server? Будет ли это разрешено логически и в рамках ваших бизнес-требований?

Предположим, вы ...

  1. извлечения данных необработанных транзакций DB2 в рабочий файл,
  2. Перенести WORKFILE к SQL Server,
  3. выполнить любой обработки вы хотите сделать в SQL Server
  4. сообщить DB2, чтобы обновить таблицу транзакций на основе рабочего файла

Итак, в DB2 # 1 может выглядеть как

INSERT INTO workfile 
    SELECT * 
    FROM transactions 
    WHERE flag = unprocessed 

На шаге 3, ваша работа SQL Server может обновить флаг в рабочий файл в состояние ошибки, для любых записей, которые SQL Server не может обработать должным образом.

Шаг 4 в DB2 может быть

UPDATE transactions 
    SET flag = processed 
    WHERE transid IN (SELECT transid 
         FROM workfile 
         WHERE flag <> error 
        ) 

Будем надеяться, что ошибки в обработке на SQL Server будет довольно редко. Если этот процесс обновляет транзакции в рабочем файле, только при ошибке, это должно быть быстрее, чем передача обновлений для каждого успеха. Вышеприведенный выше оператор UPDATE должен иметь возможность работать быстрее в DB2, поскольку он управляется рабочим файлом на том же сервере, а не передается данные обратно в DB2.

+0

Это по существу то, что мы делаем сейчас. Исходная программа добавляет записи в общий рабочий файл на db2, я переношу записи на SQL Server через мою хранимую процедуру, а затем обновляю обработанный флаг в рабочем файле. –

Смежные вопросы