скорость вставки записей (Firebird)

claster2
Дата: 13.09.2005 16:37:30
Подскажите,как увеличить скорость вставки записей, я убрал все индексы и ключи, но данные все равно заливаются в 5 раз медленнее того же myskl. Я бы выделил побольше табличного пространства, если бы знал, как это делается (:
Kull Damned
Дата: 13.09.2005 16:39:14
Покажи код как это производишь.

Posted via ActualForum NNTP Server 1.3

Лентяй
Дата: 13.09.2005 16:48:11
Почитай про External Tables.
Sash*
Дата: 13.09.2005 16:48:12
может памяти у сервера не хватает
Лентяй
Дата: 13.09.2005 16:49:32
Sash*
может памяти у сервера не хватает

Может... или винт медленный, или сетевуха сбоит или код кривой ...
kdv
Дата: 13.09.2005 17:06:38
или транзакции стартует на каждый инсерт...

короче. нечего гадать, пусть приведет как это он делает. НО. В любом случае вставка будет медленнее, чем в MSQL 3.x, ибо там транзакций и версий нет, а тут - есть.
dalai lamer
Дата: 13.09.2005 17:10:45
kdv
или транзакции стартует на каждый инсерт...

короче. нечего гадать, пусть приведет как это он делает. НО. В любом случае вставка будет медленнее, чем в MSQL 3.x, ибо там транзакций и версий нет, а тут - есть.
MySQL

ps/ хоть одно умное слово могу вставить! :)
Мимопроходящий
Дата: 13.09.2005 18:01:39

Привет, dalai!
Ты пишешь:

dalai
dl> MySQL
dl> ps/ хоть одно умное слово могу вставить! :)
О!
Ты живой?
Чего не заходишь?

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3

dalai lamer
Дата: 13.09.2005 18:12:09
Мимопроходящий

Привет, dalai!
Ты пишешь:

dalai
dl> MySQL
dl> ps/ хоть одно умное слово могу вставить! :)
О!
Ты живой?
Чего не заходишь?
Привет!
я рид онли: сказать нечего! :)
claster2
Дата: 13.09.2005 18:21:57
Уф, пишу код. Сильно не бить, и так плохо :)

typedef std::map<AnsiString,Variant> PARAMARRAY;

void __fastcall ExportMemTableToDb(TSQLMemTable* pTable)
{
if(!pTable->Exists)
return;
if(!pTable->Active)
pTable->Open();
AnsiString FieldList;
AnsiString ParamList;
for(int i=0; i<pTable->FieldCount; i++){
AnsiString sep=(FieldList=="")?"":",";
FieldList+=sep+pTable->Fields->Fields->FieldName;
ParamList+=sep+":"+pTable->Fields->Fields->FieldName;
}
AnsiString InsertSqlText="insert into "+
pTable->TableName+"("+FieldList+") values("+ParamList+")";
PARAMARRAY Params;
pTable->First();
while(!pTable->Eof){
for(int i=0; i<pTable->FieldCount; i++){
TField* pField=pTable->Fields->Fields;
Params[pField->FieldName]=pField->Value;
}
DoExecuteSQL(InsertSqlText.c_str(),&Params);
pTable->Next();
}
pTable->Close();
}

void* __stdcall DoExecuteSQL(char* Query,PARAMARRAY* Params)
{
std::auto_ptr<TpFIBQuery> Qry(new TpFIBQuery(NULL));
Qry->Database=MainDB;
Qry->Transaction=UpdTrans;
Qry->Options=Qry->Options << qoStartTransaction << qoAutoCommit;
Qry->SQL->Text=Query;
if(Params)
for(int i=0; i<Qry->Params->Count; i++)
Qry->Params->Vars->Value=(*Params)[Qry->Params->Vars->Name];
Qry->ExecQuery();

return (void*)Qry->RowsAffected;
}

структура таблицы

CREATE TABLE a (
ID INTEGER NOT NULL,
DOCID INTEGER,
VARID INTEGER,
LINE INTEGER,
STRVAL VARCHAR(252)
);

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