Время ответа на запрос AS / 400 - PullRequest
1 голос
/ 07 июля 2011

Что я делаю ....

Я подключаюсь к AS400 через ODBC (в настоящее время я должен использовать ODBC) в приложении C # /. Net. Запросы очень медленные. Я запускаю DBmonitor и запрашиваю файл, который он возвращает, где QQIDXA = 'Y', и мне говорят создать индексы, которые уже существуют. Коды причин: I1 и I3.

Я перестроил индексы в том же порядке, что и предложения where, но не повезло.

Что я могу сделать, чтобы улучшить мои запросы AS400 ???

Ахий, LarryR ...

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Сначала немного номенклатуры. AS / 400 - очень, очень, очень старая машина. Сейчас некоторые люди настаивают на том, чтобы называть последующие модели «AS / 400» по привычке. Это может работать против вас при поиске в Интернете. IBM сделала несколько поколений машин среднего класса после AS / 400. Попробуйте iSeries, System i и IBM i.

База данных на этих компьютерах среднего уровня является вариантом DB2 и, как таковая, настроена почти так же, как любая другая база данных. Правильные индексы обычно являются первым решением проблем производительности базы данных. Не смотрите только на предложение WHERE; Также рассмотрите возможность присоединения и заказа.

IBM имеет программное обеспечение под названием Client Access (iSeries Access, IBM i Access), которое имеет бесплатный компонент под названием Navigator. Навигатор имеет очень хороший инструмент БД под названием Visual Explain. Попросите администратора среднего уровня установить Navigator на ваш ПК.

IBM опубликовала несколько Redbooks по настройке базы данных, которые могут помочь:

2 голосов
/ 18 июля 2011

Общая проблема, с которой я сталкиваюсь при запросах и индексах DB2 / 400, связана с атрибутами полей. Если, например, вы объединяете две таблицы, используя поля, которые не имеют одинаковых атрибутов, тогда базе данных может потребоваться создать специальный индекс «на лету» после получения временного поля. Например, Числовое (8,0) отличается от Десятичного (11,3). Даже если вы можете объединить их вместе, часто создается временный индекс. Это раздражение, чтобы быть уверенным. Исправление, которое я часто использую, заключается в том, чтобы привести свои поля в оператор соединения, чтобы я всегда соединял поля вместе с правильными атрибутами. Вот пример:

LEFT JOIN DBRQRQH ON DBRQH_COMPANY = DBWHS_COMPANY AND DBRQH_REQ_NUMBER = CAST(DBWHS_DOC_NBR AS NUMERIC(7,0))

То же самое может иногда, хотя и не так часто, быть верным для вашего предложения WHERE. Если приведение объединений не помогает, попробуйте использовать CASTы с критериями выбора.

Вот еще один совет по оптимизации производительности запросов. Запустите программу на C # в сеансе отладки с точкой останова после подключения через ODBC и перед выполнением запроса. Затем найдите задание ODBC в AS / 400 (iSeries) с помощью WRKACTJOB JOB (QZDASOINIT). Ищите работу, на которой есть ваш профиль пользователя. Или, по крайней мере, профиль пользователя, используемый при подключении. Когда вы найдете это задание, переведите его в режим отладки с помощью этих двух команд (с зеленого экрана):

STRSRVJOB JOB(258094/QUSER/QZDASOINIT)

(Примечание: номер задания будет меняться в зависимости от того, какое задание ODBC вы найдете).

STRDBG UPDPROD(*YES)

Затем запустите запрос из программы на C # и просмотрите журнал заданий выбранного задания QZDASOINIT в AS / 400. Когда SQL выполняется в задании, находящемся в режиме отладки, в журнале заданий появляются все виды полезных вещей. Когда вы закончите, не забудьте запустить ENDDBG, а затем ENDSRVJOB.

2 голосов
/ 07 июля 2011

Возможно, вы также захотите разместить свой вопрос в списке рассылки MIDRANGE-L .

Там много экспертов по DB2.

...