AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.08.2009, 14:55   #1  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
! 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.
Продемострировать на примере это можно легко (на Ax3sp3kr3):
Создать таблицу 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;
}
В итоге получим сообщение "1000!", т.е. одну и ту же строку можно гонять внутри этого курсора много раз.
При чём, если индекса нет (т.е. идёт сортировка после полного просмотра таблицы, а не по индексу), то этого эффекта не возникает. Насколько я понимаю, потому что сервер сначала сортирует весь выбранный резалтСет в памяти, и идёт уже по нему, а не сканирует последовательно индекс...

Сразу оговорюсь, что update внутри цикла через другую табличную переменную ничем не помогает...

На DAX 2009 + SQL 2005 такая ситуация не повторяется, подозреваю что из-за уровня изоляции read commited snapshot. (хотя доказать обратного не могу, не пробовал, не вижу большого смысла )

Насколько я понимаю, в 3-ке с 2000-м сиквелом избавится от подобного эффекта никак не удасться? Или может кто-то пробовал?
Я не имею ввиду "танцы с бубнами" с какими-нибудь мэпами и т.п., а по-человечески.
__________________
Zhirenkov Vitaly
Старый 12.08.2009, 15:41   #2  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от ZVV Посмотреть сообщение
Насколько я понимаю, в 3-ке с 2000-м сиквелом избавится от подобного эффекта никак не удасться?
X++:
while select forUpdate testTab order by Field, RecId
Старый 12.08.2009, 15:56   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Vadik Посмотреть сообщение
X++:
while select forUpdate testTab order by Field, RecId
Это поможет только в одном случае - когда индекс по Field неуникальный и Аксапта к нему "в фоне" не прицепила RecId. Т.е. в данном примере, если CreateRecIdIndex установлен в true. Только тогда сервер откажется от использования индекса в пользу полного просмотра. Ну конечно всегда можно добавить ещё какое-то поле, не входящее в индекс, но тут встаёт вопрос производительности...
А с уникальным индексом такое вообще не сработает.

UPD ну хотя может конечно и прокатит для определённых случаев и с уникальными, надо строить тест-кейсы. Но всё равно это не панацея.
__________________
Zhirenkov Vitaly

Последний раз редактировалось ZVV; 12.08.2009 в 16:01.
Теги
query, запрос (query)

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
gatesasbait: Improved AOT Queries in Ax2009 Blog bot DAX Blogs 3 12.10.2011 15:03
Dianne Siebold: AIF Queries & Schemas: A Picture is Worth a Thousand Words Blog bot DAX Blogs 0 12.09.2008 02:05
palleagermark: Dynamic date ranges in queries Blog bot DAX Blogs 8 07.05.2008 17:03
C# and AX Development: Complex Queries in AX Blog bot DAX Blogs 2 06.03.2008 17:57

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:33.