Re: печалька для тестеров execute block+STATEMENT+ON EXTERNAL
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 сек. Где то в сервере что то поменялось однако ;)
Re: печалька для тестеров execute block+STATEMENT+ON EXTERNAL
(время мин:сек) Задача подключится на локальной машине к соседней базе и скопировать записи таблицы. В надежде ускорить вставку был в недоумении. Думая что execute block+STATEMENT к другой базе даст прирост при вставке переписал код. Но каково было удивление, что прирост был не велик /Коннект локальный\сетевой ? На таблице-приёмнике есть триггеры\индексы ? /С чем вообще сравниваешь ? И какого прироста ты ожидал ? :-D 1.коннект только локальный т.к. нужно максимум производительности 2.На момент вставки триггеров нет. В большинстве случаев я применяю тупой INSERT. Но не в нижеприведенном. Т.к. там UPDATE OR INSERT то - либо индексы есть (и это уже не ускоряет вставку) и чем их больше, тем хуже, - либо их нет - что есть смерть для UPDATE OR INSERT. 3.Сравниваю старый вариант построчно вставляемый мной и вариант полностью выполняемый блоком Во втором варианте ты исключил как минимум передачу параметров на сервер- приёмник. 4.В моем варианте, я думал, что сервер тратит много времени на чтение строки из одной базы и вставку в другую базу. Оказалось что эти манипуляции настольно малы, что на это можно практически не обращать внимания. Судя по загрузке процессора он не работает. Я думаю проблема в обмене данными с дисками. Не надо думать. Освой perfmon - и уже потом думай. Вообще очень хотелось, чтобы кто нить поглядел место при вставке у сервера. Но с другой стороны не я один об этом подумываю, уже наверное смотрели. Просто когда 3 Гб база переливается в новую базу 4 часа становится тоскливо. Для любителей тестов скажу SSD на том же компе 1 час. Патология какая-то, явно что-то не так. Ресторится она у тебя тоже 4 часа на этом же железе ? Последнее время прогресс стоит на месте. Все железо от 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, но тогда нельзя будет продолжить. Я скажу - прочитай GDSCODE и выдай его SUSPEND'ом наружу для анализа, если надо. -- Хорсун Влад PS xCount не вычисляется, накой он нужен
Re: печалька для тестеров execute block+STATEMENT+ON EXTERNAL
Boltik Evgeny ... Добрый день. (время мин:сек) Задача подключится на локальной машине к соседней базе и скопировать записи таблицы. В надежде ускорить вставку был в недоумении. Думая что execute block+STATEMENT к другой базе даст прирост при вставке переписал код. Но каково было удивление, что прирост был не велик Коннект локальный\сетевой ? На таблице-приёмнике есть триггеры\индексы ? С чем вообще сравниваешь ? И какого прироста ты ожидал ? :-D теряем возможность получить ошибку и продолжить вставку, если надо продолжить. С чего бы это ? -- Хорсун Влад