Медленное чтение данных из прилинкованной таблицы (MS Dynamics NAV)


: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/users/d/dm9/domains/mokshin.su/includes/unicode.inc on line 311.

Интересное наблюдение. Обнаружено на версии 2009, на других не проверялось.

Обнаружилось медленное (ооочень медленное) чтение данных из прилинкованной таблицы, которая ссылается на таблицу на удаленном прилинкованном SQL сервере.

При этом, если смотреть по времени обращения в цикле по записям, то картина такая:

1. Первая запись считывается быстро (миллисекунды)
2. Чтение следующих - быстрое (возможно, они уже считаны и находятся в кэше/буффере - но здесь это не суть)
3. 3-я запись считывается долго (секунды!)
4. Следующие 4 - быстро
5. 8-я - долго (секунды!)
6. Следующие 19 - быстро
7. 28-я - долго (секунды!)
- большее количество строк не проверялось

Удалось "победить" заменой первого оператора поиска FINDFIRST на FINDSET - чтения "всех" строк в цикле происходят быстро (миллисекунды), но есть одно НО:
- FINDSET практически всегда лучше для использование в цикле, чем FINDFIRST, т.к. FINDSET считывает сразу порцию записей - порция определяется настройках в свойстве БД (Advanced, Caching / Record Set)
- если в настройках стоит 50, то выполняется запрос типа SELECT TOP 51 .....
- и если в цикле строк больше чем в настройке, то потом начинается такая же вышеописанная картинка - после обработки, в данном примере, 51-й записи - тормоза на следующих: 3-й, 8-й и т.п.

Всё дело в том, что, как я понимаю, после того как NAV обработал все считанные записи, он берет следующие, но запрос при этом конструируется на значениях первичного ключа - что-то типа:
SELECT .... FROM .... WHERE ..... AND ID > (@LastReadID)
- где ID - это первичный ключ, а условно @LastReadID - ID в последней обработанной записи в цикле
Ну и если первичный ключ сложный (из нескольких полей), то можно представить какая там будет комбинация...
SQL сервер может в этом случае не особо оптимально делать выборку (т.к. есть еще и дополнительные условия по отбору записей, конечно), особенно если нет адекватных индексов.

Почему 3-я, 8-я, 28-я? Не знаю :-) Не вникал. Какая-то внутренняя логика NAV'а.

Ссылки по теме:
Difference between Find('-') and FindFirst
Работа с переменными типа Record в Navision
Работа с Record. Часть четвертая, практическая


Нравится


Последние комментарии