claster2
Дата: 13.09.2005 16:37:30
Подскажите,как увеличить скорость вставки записей, я убрал все индексы и ключи, но данные все равно заливаются в 5 раз медленнее того же myskl. Я бы выделил побольше табличного пространства, если бы знал, как это делается (:
kdv
Дата: 13.09.2005 17:06:38
или транзакции стартует на каждый инсерт...
короче. нечего гадать, пусть приведет как это он делает. НО. В любом случае вставка будет медленнее, чем в MSQL 3.x, ибо там транзакций и версий нет, а тут - есть.
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, только другими компонентами.
Хорошая подсказка насчет транзакций, нужно попробовать залить все в одной транзакции.