Общая проблема, с которой я сталкиваюсь при запросах и индексах 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.