|
25.12.2002, 11:22 | #1 |
Участник
|
Массовый Insert / инициализация таблицы
Привет !
Есть таблица , в ней 3 поля, ее нужно заполнить (проинициализировать) значениями ключа от 1 до "Х". Остальные поля - знаечния фиксированы. Как это сделать оптимально ? следующий код в static методе таблицы, выполняющемся на сервере (при Х = 100000) Gamenumber = 50; for (i=1; i<= Х ; i++) { t.VariantNumber = i; t.GameNumber = Gamenumber; t.Possible = True; t.doInsert(); } работает 27 секунд. Это много. Нет - ли какого - нибудь "массового" inserta , что - то типа как в СИ инициализируется область памяти. Чтобы загнать значения в какой - нить буфер, а потом одним оператором из этого буфера вставить все это дело в таблицу ??? |
|
26.09.2007, 14:09 | #2 |
Участник
|
Использую примерно так, ничего не получается. Что сделано не так?
X++: TableMy t; RecordInsertList arrayInsert = new RecordInsertList(tableNum(TableMy ),true,true); for (i=1; i<= ; i++) { t.VariantNumber = i; t.GameNumber = Gamenumber; arrayInsert.add(t); } arrayInsert.insertDatabase(); Причина не работы выяснилась метод не может работать с временными таблицами, только не пойму почему? Последний раз редактировалось Arahnid; 26.09.2007 в 14:40. |
|
27.09.2007, 13:37 | #3 |
Участник
|
Товарищи, ну давайте без разборок, я же вопрос задала и надеялась оответ услышать на вопрос, а не ответ, как уничтожить врага на работе.
|
|
27.09.2007, 14:10 | #4 |
Участник
|
Цитата:
Там ссылка на файл этой таблицы нужно чтобы сохранялась при добавлении записей. А с использованием этого класса это не происходит. Потому что он на это не рассчитан. Но он вполне справедливо на это не рассчитан. Вставка записей во временную таблицу в любом случае идет последовательно, запись за записью, потому что это файл на диске. Поэтому выигыша от использования пакетной вставки не было бы. |
|
27.09.2007, 22:34 | #5 |
Участник
|
|
|
27.09.2007, 14:09 | #6 |
Участник
|
Попробовал. На таблице из трех полей ваш джоб запускать для темповой doInsert и для настоящей arrayInsert.insertDatabase() - результат приблизительно одинаковый 20 и 25 секунд - в пользу настоящей. Смысл в том, что темповые таблицы в принципе не расчитаны на такие объемы (100 000). Если бы рассказали подробнее постановку задачи - было б легче.
|
|
27.09.2007, 15:39 | #7 |
Administrator
|
Тут я говорил про этот класс (RecordInsertList). Фактом могу подтвердить увеличение скорости минимум в 6 раз по сравнением с doInsert.
Он действительно рассчитан на постоянные таблицы
__________________
Возможно сделать все. Вопрос времени |
|
27.09.2007, 17:42 | #8 |
Участник
|
Пробовал вставлять без ttsbegin и ttscommit большое количество строк.
С ними система зависала. Т.к. кэш похоже перегружался. Ведь надо же где то эту транзакцию хранить. Без них в кэш ничего не идёт. Или очень мало. И всё сработало. Правда есть вероятность. Что в каком то месте оборвётся вставка. И выйдет половина вставилась, а половина нет. Но job можно дописать таким макаром, чтоб то что не доставилось довставлялось пока всё не вставиться. |
|
27.09.2007, 17:46 | #9 |
Участник
|
Вообще-то достаточно флага обычного, что все удачно вставилось.
И только если флаг установлен, продолжается обработка этой временной таблицы. А так как она временная, нет нужны беспокоиться о ее очисте перед повторным использованием. |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|