Показать сообщение отдельно
Старый 05.04.2011, 19:53   #12  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от oip Посмотреть сообщение
А как-нибудь вот так?
Перепроверил - получилось, спасибо. Обидно, правда, что куча времени теряется на внутренний select:
X++:
table1 = Table1::findRec(table1Loop.RecId, true);

Подумалось, может быть сделать что-то вроде следующего:

X++:
Table1 table1;
int bulk = 5000;    // 5;
RecId lastRecId;
int i;
;

do
{
    i = 0;
	
    ttsbegin;

    while select forupdate table1
        order by RecId
        where table1.RecId > lastRecId
    {
        table1.Field1 = strfmt("Blah %1", i);
        table1.doupdate();

        lastRecId = table1.RecId;
        i++;

        if (i >= bulk)
            break;
    }

    ttscommit;
}
while (i >= bulk);

Выглядит оптимальным решением, нет? Правда, работать будет быстро только при наличии уникально индекса по одному полю. Сейчас попробую.

Последний раз редактировалось Hyper; 05.04.2011 в 20:05.