"Khorsun Vlad" сообщил(а) в новостях
следующее:jislai$obn$1...@dough.gmane.org...
"Boltik Evgeny" ...
Добрый день.
(время мин:сек) Задача подключится на локальной машине к соседней базе и
скопировать записи таблицы.
В надежде ускорить вставку был в недоумении.
Думая что execute block+STATEMENT к другой базе даст прирост при вставке
переписал код.
Но каково было удивление, что прирост был не велик
/ Коннект локальный\сетевой ? На таблице-приёмнике есть триггеры\индексы
?
/С чем вообще сравниваешь ? И какого прироста ты ожидал ? :-D
1.коннект только локальный т.к. нужно максимум производительности
2.На момент вставки триггеров нет. В большинстве случаев я применяю тупой
INSERT.
3.Сравниваю старый вариант построчно вставляемый мной и вариант полностью
выполняемый блоком
4.В моем варианте, я думал, что сервер тратит много времени на чтение строки
из одной базы и вставку в другую базу. Оказалось что эти манипуляции
настольно малы, что на это можно практически не обращать внимания.
Судя по загрузке процессора он не работает. Я думаю проблема в обмене
данными с дисками. Вообще очень хотелось, чтобы кто нить поглядел место при
вставке у сервера. Но с другой стороны не я один об этом подумываю, уже
наверное смотрели. Просто когда 3 Гб база переливается в новую базу 4 часа
становится тоскливо. Для любителей тестов скажу SSD на том же компе 1 час.
Последнее время прогресс стоит на месте. Все железо от 2006 года работает
практически также как и новое от 2011 года узкое место жесткий диск :).
теряем возможность получить ошибку и продолжить вставку, если надо
продолжить.
/ С чего бы это ?
По порядку я получаю такую конструкцию
'execute block returns (xCount integer) as'#13#10+
'%sParams%'#13#10+
'begin'#13#10+
' FOR EXECUTE STATEMENT (''select %sGetF% from (%sSql%)'')'#13#10+
' ON EXTERNAL ''%sBase%'''#13#10+
' AS USER CURRENT_USER PASSWORD ''masterkey'' -- just for example'#13#10+
' WITH AUTONOMOUS TRANSACTION -- note autonomous transaction'#13#10+
'-- for update'#13#10+
' INTO %sInsP%'#13#10+
' do begin'#13#10+
' UPDATE OR INSERT INTO %sTable% (%sInsF%)'#13#10+
' VALUES (%sInsP%)'#13#10+
' MATCHING (%sPK%);'#13#10+
' suspend;'#13#10+
' end'#13#10+
'end;';
подключаемся ко второй базе и вставляем в текущую записи. Предположим при
вставке произошла ошибка, но надо продолжить. Наши действия без вывода
вменяемой ошибке таковы WHEN ANY DO. С одной стороны достаточно но что за
ошибка была? Ты скажешь убери WHEN ANY DO, но тогда нельзя будет продолжить.
Ошибки переноса данных можно разделить на 2 вида.
1=Критические - перенос дальше не возможет. потеря нужных данных
2=Не критические - т.к. были допущены ошибки разработчика или не повлекут
потерю важных данных(несвоевременное обновление базы данных или клиент не
обслуживался но все же решил перейти на новую версию с возможной потерей
неважных данных)
Желания.
1.Вообще хотелось бы чтобы в WHEN ANY DO можно было получить текст ошибки. И
уже самому решить этот текст вернуть или свой.
2.И могу сделать тест создания базы данных который делался 1 минуту, а
теперь 2 мин 30 сек. Где то в сервере что то поменялось однако ;)