12.08.2009, 14:55 | #1 |
MCITP
|
Runaway Queries
В доке по 3-ей Аксапте написано следующее (про работу с MS SQL Server-ом, не для Оракла)
Цитата:
Axapta uses dynamic cursors when querying against the database in order to avoid time-consuming temporary snapshots. This can lead to “runaway queries” if the query is used loop through the result set and insert / update other rows, which is qualified to be included in the result set.
Создать таблицу ZVVTestTab с единственным int-полем Field и (что немаловажно) с индексом по этому полю: X++: static void ZVVTestJob(Args _args) { ZVVTestTab testTab; int i; int cnt = 1000; ; ttsBegin; delete_from testTab; for (i=1; i<cnt; i++) { testTab.Field = i; testTab.insert(); } ttsCommit; ttsBegin; while select forUpdate testTab order by Field { switch (testTab.Field) { case 1: testTab.Field = cnt; testTab.update(); break; case cnt: info(strFmt("%1!", cnt)); break; } } ttsCommit; } При чём, если индекса нет (т.е. идёт сортировка после полного просмотра таблицы, а не по индексу), то этого эффекта не возникает. Насколько я понимаю, потому что сервер сначала сортирует весь выбранный резалтСет в памяти, и идёт уже по нему, а не сканирует последовательно индекс... Сразу оговорюсь, что update внутри цикла через другую табличную переменную ничем не помогает... На DAX 2009 + SQL 2005 такая ситуация не повторяется, подозреваю что из-за уровня изоляции read commited snapshot. (хотя доказать обратного не могу, не пробовал, не вижу большого смысла ) Насколько я понимаю, в 3-ке с 2000-м сиквелом избавится от подобного эффекта никак не удасться? Или может кто-то пробовал? Я не имею ввиду "танцы с бубнами" с какими-нибудь мэпами и т.п., а по-человечески.
__________________
Zhirenkov Vitaly |
|