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 , что - то типа как в СИ инициализируется область памяти. Чтобы загнать значения в какой - нить буфер, а потом одним оператором из этого буфера вставить все это дело в таблицу ??? |
|
25.12.2002, 14:27 | #2 |
NavAx
|
Никакого массового insert-a нет, он и не нужен.
Интересно, зачем понадобилось инициализировать все 100 000 полей таблицы? Неужели нельзя инициализировать запись по мере надобности?
__________________
С уважением, Игорь Ласийчук. |
|
25.12.2002, 19:45 | #3 |
Banned
|
Массовый insert есть в версии 3.0, он активно используется для обновления данных:
PHP код:
|
|
26.12.2002, 18:55 | #4 |
Участник
|
Рискну добавить.
Если подумать, то массовый инсерт противоречит ООП подходу ) С точки зрения ООП, каждая запись является объектом. Поэтому массовый инсерт может не всегда сработать корректно. Особенно в навороченных стандартных таблицах. |
|
26.12.2002, 19:27 | #5 |
Banned
|
Мне пока такая философская высота не подвластна.
Код бывает правильным или неправильным, arrayInsert или запишет правильные данные, или запишет неправильные. Условие лишь в том, чтобы записи не зависели друг от друга, а на такой анализ хватит любого программиста. |
|
26.12.2002, 20:10 | #6 |
Участник
|
Не думаю, что хватит в общем случае.
Если попробовать сделать массовый инсерт в InventTrans, то никакого программитса не хватит. Там столько оговорок и возможных побочных эффектов при МАССОВОЙ вставке. Хотя согласен с тем, что в большинстве случаев, массовая вставка полезная весчь. |
|
30.12.2002, 15:11 | #7 |
Banned
|
В этом форуме очень важно оставить за собой последнее слово
Думаю как раз, что на анализ InventTrans.insert() программиста хватит. Поняв, что метод подозрительно сложный, он спокойно использует while select. А если программист более хитроумный, то решит задачу в два приема: сначала вставит InventTrans, а затем - массово - обновит InventSum/ |
|
03.01.2003, 00:32 | #8 |
Участник
|
А inventTransPosting? А резервы? А связь с основными средствами? Не думаю, что все так просто |
|
26.09.2007, 14:09 | #9 |
Участник
|
Использую примерно так, ничего не получается. Что сделано не так?
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, 11:44 | #10 |
Участник
|
Цитата:
Сообщение от EVGL
В этом форуме очень важно оставить за собой последнее слово
Думаю как раз, что на анализ InventTrans.insert() программиста хватит. Поняв, что метод подозрительно сложный, он спокойно использует while select. А если программист более хитроумный, то решит задачу в два приема: сначала вставит InventTrans, а затем - массово - обновит InventSum/ Помню делаю ревью кода - грю челу - у тебя одна и та же перменная используется в разных контекстах пять раз, неужели дополнительную лень объявить? Ответ меня поразил - "Моя переменная, что хочу то и делаю". Последний раз редактировалось MironovI; 27.09.2007 в 11:48. |
|
27.09.2007, 11:55 | #11 |
Участник
|
|
|
27.09.2007, 12:04 | #12 |
Участник
|
|
|
27.09.2007, 13:37 | #13 |
Участник
|
Товарищи, ну давайте без разборок, я же вопрос задала и надеялась оответ услышать на вопрос, а не ответ, как уничтожить врага на работе.
|
|
27.09.2007, 14:09 | #14 |
Участник
|
Попробовал. На таблице из трех полей ваш джоб запускать для темповой doInsert и для настоящей arrayInsert.insertDatabase() - результат приблизительно одинаковый 20 и 25 секунд - в пользу настоящей. Смысл в том, что темповые таблицы в принципе не расчитаны на такие объемы (100 000). Если бы рассказали подробнее постановку задачи - было б легче.
|
|
27.09.2007, 14:10 | #15 |
Участник
|
Цитата:
Там ссылка на файл этой таблицы нужно чтобы сохранялась при добавлении записей. А с использованием этого класса это не происходит. Потому что он на это не рассчитан. Но он вполне справедливо на это не рассчитан. Вставка записей во временную таблицу в любом случае идет последовательно, запись за записью, потому что это файл на диске. Поэтому выигыша от использования пакетной вставки не было бы. |
|
27.09.2007, 15:39 | #16 |
Administrator
|
Тут я говорил про этот класс (RecordInsertList). Фактом могу подтвердить увеличение скорости минимум в 6 раз по сравнением с doInsert.
Он действительно рассчитан на постоянные таблицы
__________________
Возможно сделать все. Вопрос времени |
|
27.09.2007, 17:42 | #17 |
Участник
|
Пробовал вставлять без ttsbegin и ttscommit большое количество строк.
С ними система зависала. Т.к. кэш похоже перегружался. Ведь надо же где то эту транзакцию хранить. Без них в кэш ничего не идёт. Или очень мало. И всё сработало. Правда есть вероятность. Что в каком то месте оборвётся вставка. И выйдет половина вставилась, а половина нет. Но job можно дописать таким макаром, чтоб то что не доставилось довставлялось пока всё не вставиться. |
|
27.09.2007, 17:46 | #18 |
Участник
|
Вообще-то достаточно флага обычного, что все удачно вставилось.
И только если флаг установлен, продолжается обработка этой временной таблицы. А так как она временная, нет нужны беспокоиться о ее очисте перед повторным использованием. |
|
27.09.2007, 22:34 | #19 |
Участник
|
|
|