Re: печалька для тестеров execute block+STATEMENT+ON EXTERNAL

2012-03-04 Пенетрантность Boltik Evgeny



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

2012-03-04 Пенетрантность Vlad Khorsun

(время мин:сек) Задача подключится на локальной машине к соседней базе и 
скопировать записи таблицы.
В надежде ускорить вставку был в недоумении.
Думая что 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

2012-03-03 Пенетрантность Khorsun Vlad

Boltik Evgeny ...

Добрый день.

(время мин:сек) Задача подключится на локальной машине к соседней базе и 
скопировать записи таблицы.
В надежде ускорить вставку был в недоумении.
Думая что execute block+STATEMENT к другой базе даст прирост при вставке 
переписал код.
Но каково было удивление, что прирост был не велик


   Коннект локальный\сетевой ? На таблице-приёмнике есть триггеры\индексы ?
С чем вообще сравниваешь ? И какого прироста ты ожидал ? :-D


теряем возможность получить ошибку и продолжить вставку, если надо продолжить.


   С чего бы это ?

--
Хорсун Влад