Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скоросная закачка в Interbase [D6, IB6.x]


Страницы:   1 2

Ptr ©   (2002-06-25 09:01:00) 

ПОМОГИТЕ СОВЕТОМ!!!
Закачка в InterBase 5934 записей продолжается 6 мин 12 сек !!!
Пробывал разные варианты:
- IBTable.Append;
- IBDataSet.Append;
- IBSQL.ExecQuery("insert into Base1 (Field1, ... Field10)
values (:Value1, ... :Value10)");
Разница в секундах.
А может быстре InterBase не может ???
(Сервер локальный и сеть не влияет.)


Ptr   (2002-07-02 10:46:00) [1]

Спасибо друзья.
Проблема решилась когда я перешед на клиента (т.е. TSQLDataSet) и закачку осуществляю один раз в конце.
Так 100000 записей грузятся около 8 сек. Правда закачка на сервер идет порядка 1 мин, но это уже мелочи...

Еще раз спасибо.


Andrew_Kandaurov   (2002-06-25 19:01:00) [2]

Все тормоза от Excel. Експортни екселевский файл в txt или csv. А из него уже и закачивай обычными паскалевскими READ-ами. Потому что все эти CELLS,ITEMS и т.д. работают крайне медленно.


DarkGreen   (2002-06-25 14:11:00) [3]

Попробуй вместо IBX использовать FreeIBPlus, IMHO они быстрее. У меня подобная задачка была, нужно было пакетно из текстового файла закачать ~ 20000 записей, на IBX я так ни чего и не добился, работала в лучшем случае 5 минут (в начале было 20 минут), а на FIBPlus 1 минута, хотя конечно я довольно долго добивался этого результата.
Но если коротко. Как говорили выше, никогда не используй ParamByName и FieldByName они поля ищут простым перебором (про Locate молчу, там вообще мраки (взгляни в исходный код)). Для добавления записей используй хранимые процедуры. Комить через каждые 200 - 300 вставок.


Ptr   (2002-06-25 11:18:00) [4]

СПАСИБО ЗА УЧАСТИЕ!!! Бду дальше ломать голову...


Alexandr   (2002-06-25 11:11:00) [5]

ну вот видишь


Ptr   (2002-06-25 11:05:00) [6]

IBServer.exe практически в 0%
моя программа я тут потестировал и смотри, что получается
коментирую весь код процедуры за исключением Locate = время работы 3"17""
коментирую весь код процедуры за Parm[index]:= value
- время работы 1"37""
Кстати и только загрузка параментров из Excel (т.е.):
if VarIsEmpty(Cells.Item[ExcelRw,1].value) then exit
else PR.Date := Cells.Item[ExcelRw,1].value;

if Cells.Item[ExcelRw,2].FormulaR1C1 = "" then PR.x2:= "-"
else PR.x2:= Cells.Item[ExcelRw,2].FormulaR1C1;

if Cells.Item[ExcelRw,3].FormulaR1C1 = "" then PR.x3:= "-"
else PR.x3:= Cells.Item[ExcelRw,3].FormulaR1C1;

if VarIsEmpty(Cells.Item[ExcelRw,5].Value) then PR.x4:= 0
else PR.x4:= RoundTo(Cells.Item[ExcelRw,5].value,-2);

if VarIsEmpty(Cells.Item[ExcelRw,6].Value) then PR.x5:= 0
else PR.x5:= RoundTo(Cells.Item[ExcelRw,6].value,-2);

if VarIsEmpty(Cells.Item[ExcelRw,7].Value) then PR.x6:= 0
else PR.x6:= RoundTo(Cells.Item[ExcelRw,7].value,-2);

if VarIsEmpty(Cells.Item[ExcelRw,8].Value) then PR.x7:= 0
else PR.x7:= RoundTo(Cells.Item[ExcelRw,8].value,-2);
тоже долго работает - 4" 12""
Процессор p4 2 ГГц и винт 7500 об.
А насчет "явного StartTransaction - Commit" конечно ты прав нет смысла записывать после каждой записи. Теперь думаю, как это убрать...



Alexandr   (2002-06-25 10:40:00) [7]

именно твоя программа, а не IBServer.exe?

Значит тормоза у тебя в программе
так как насчет явного StartTransaction - Commit


Ptr   (2002-06-25 10:35:00) [8]

Интересно, но обращений к винту практически нет, ну а все процессорное время (99%) жрет собственно сама прогамма...
Индексы есть


Alexandr   (2002-06-25 10:33:00) [9]

ах вот каков этот IBSQL... Я догадывался, но не знал как именно такое в нем происходит.


Desdechado   (2002-06-25 10:32:00) [10]

имхо, главные тормоза от неявного использования транзакций. на каждое добавление в таком случае отдельная транзакция происходит. определи транзакцию явно перед закачкой, вставь все записи и закоммить.


Alexandr   (2002-06-25 10:27:00) [11]

у тебя ОС какая? Win2000.
Так посмотри кто процессорное время жрет, Кто является источником тормозов.
IB, твоя программа, диск.


Ptr   (2002-06-25 10:24:00) [12]

Мне кажется, что еще быстрее будет непосредственное обращение к полю (в твоем случае например TDestTYPE.value := "4" т.к. asString дополнительно требует затрат, а тип поля определен явно)
Но у меня другой случай. Хотя я уже
ПЕРЕПИСАЛ КОД НА IBAQL.PARM[].


Alexandr   (2002-06-25 10:19:00) [13]

а зачем IBSQL свойство CachedUpdates?
Да и DefautAction тут вообще никаким боком...

Я же говорил про ForceWrites флаг в базе данных...

А индексы есть на этой таблице?


sniknik   (2002-06-25 10:16:00) [14]

Ptr: ParamByName долго, но это копейки
Не скажи, это очень замедляет. Правда не знаю как в IB но BDE ускоряется раза в три.
Ускорил так както перекачку таблици 3100 зап. с 5сек до 1сек с мелочью.
теперь только так и делаю.
перед циклом определяю номера записей
MasT1[0]:= TDest.FieldByName("TYPE").Index; MasT2[0]:= 0;
MasT1[1]:= TDest.FieldByName("CODE").Index; MasT2[1]:= TSour.FieldByName("BARCODE").Index;
MasT1[2]:= TDest.FieldByName("GR1").Index; MasT2[2]:= TSour.FieldByName("GROOP1").Index;
MasT1[3]:= TDest.FieldByName("GR2").Index; MasT2[3]:= TSour.FieldByName("GROOP2").Index;

а в циклах обращение только по номеру
TDest.Fields[MasT1[0]].AsString:= " 4";
TDest.Fields[MasT1[1]].AsString:= st;
TDest.Fields[MasT1[2]].AsString:= TSour.Fields[MasT2[2]].AsString;
TDest.Fields[MasT1[3]].AsString:= TSour.Fields[MasT2[3]].AsString;

но это если только не получается SQL использовать или BatchMove.


Ptr   (2002-06-25 10:10:00) [15]

C "там чуть-чуть тут чуть-чуть вот в сумме тормоза и получаются" согласен, но тут что-то координально надо менять...
База конечно заполняется т.к. у IBTransaction.DefaultAction стоит TACommit. Но
type TTransactionAction = (taRollback, taCommit, taRollbackRetaining, taCommitRetaining);
property DefaultAction: TTransactionAction;
Кроме того у IBSQL нет свойства CachedUpdates, чтобы включить Кэширование...


Alexandr   (2002-06-25 10:01:00) [16]

Для Отключения ForceWrites возьми IBConcole и для базы данных отключи этот флаг.

А вообще странный ты какой-то там чуть-чуть тут чуть-чуть вот в сумме тормоза и получаются.

А код твой вообще в базу данные вставляет?
А то действительно у IBSQL нет свойства AutoCommit, но Commit - то кто-то должен транзакции делать...


Ptr   (2002-06-25 09:56:00) [17]

Я имел ввиду коментирование оператора locate существенно не помогает.
Текст запроса IBSQL.SQL:=
"insert into CLIENT_OPERATIONS
(Field1,..., Field 10)
values
(:Parm1,..., :Parm10)"
Где выключить AutoCommit???
а ForceWrites нашел в Helpe только для TIBDatabaseInfo ???


Alexandr   (2002-06-25 09:44:00) [18]

где-где? У IBSQL естественно.
Про блокировку не понял при чем тут Locate и блокировка?

И все-таки как насчет ForceWrites у базы и тескта запроса у IBSQL...


Ptr   (2002-06-25 09:39:00) [19]

1. Блокировка т.е. // Base.Locate уменьшает до 5 мин. 40 сек.
2. ParamByName долго, но это копейки
3. Где выключить AutoCommit???


Alexandr   (2002-06-25 09:31:00) [20]

у тебя что AutoCommit стаит? Выключи. Делай вручную commit когда все вставишь.

ParamByName долго. Лучше Params[...]

А что за Base.Locate? Надо бы без этого. Отсюда тоже тормоза большие.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо