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 |
|
12.08.2009, 15:41 | #2 |
Модератор
|
|
|
12.08.2009, 15:56 | #3 |
MCITP
|
Это поможет только в одном случае - когда индекс по Field неуникальный и Аксапта к нему "в фоне" не прицепила RecId. Т.е. в данном примере, если CreateRecIdIndex установлен в true. Только тогда сервер откажется от использования индекса в пользу полного просмотра. Ну конечно всегда можно добавить ещё какое-то поле, не входящее в индекс, но тут встаёт вопрос производительности...
А с уникальным индексом такое вообще не сработает. UPD ну хотя может конечно и прокатит для определённых случаев и с уникальными, надо строить тест-кейсы. Но всё равно это не панацея.
__________________
Zhirenkov Vitaly Последний раз редактировалось ZVV; 12.08.2009 в 16:01. |
|