Здравствуйте, maxidroms, Вы писали:
M>Запись в таблицу состоящую из 12 столбцов и 5000 записей, производится около 30 сек... можно ли как нибудь увеличить скорость работы с рекордсетом
Что такое "запись в таблицу"? SQL покажи.
Re[2]: Расскажите об опциях рекордсета ADODB плиз.
//Цикл из 5000 итераций
lpRst->AddNew();
lpRst->Fields->GetItem(bstr_t("ID"))->Value = bstr_t(1);
lpRst->Fields->GetItem(bstr_t("Name"))->Value = bstr_t("test");
....
и так 12 столбцов
lpRst->Update();
//Конец цикла из 5000 итераций
или так...разница не большая
//Цикл из 5000 итераций
lpConn->Execute(_bstr_t("Insert into table...."),0,ADODB::adCmdText);
//Конец цикла из 5000 итераций
Re[3]: Расскажите об опциях рекордсета ADODB плиз.
M>или так...разница не большая
M>//Цикл из 5000 итераций M>lpConn->Execute(_bstr_t("Insert into table...."),0,ADODB::adCmdText); M>//Конец цикла из 5000 итераций
Можете попробовать еще так
ArrayList sql = new ArrayList();
for (int step=0;step<540;step++)
{
sql.Add(String.Format("INSERT INTO tbl1(fld1, fld2) VALUES({0}, 'value {0}')", step));
if (sql.Count >= 100)
{
executeSql(String.Join(";", sql.ToArray(typeof(string)) as string[]));
sql.Clear();
}
}
if (sql.Count > 0)
executeSql(String.Join(";", sql.ToArray(typeof(string)) as string[]));
или так
ArrayList sql = new ArrayList();
for (int step=0;step<540;step++)
{
sql.Add(String.Format("SELECT {0}, 'value {0}'", step));
if (sql.Count >= 100)
{
execSql("INSERT INTO tbl1(fld1, fld2) " + String.Join(" UNION ", sql.ToArray(typeof(string)) as string[]));
sql.Clear();
}
}
if (sql.Count > 0)
execSql("INSERT INTO tbl1(fld1, fld2) " + String.Join(" UNION ", sql.ToArray(typeof(string)) as string[]));
создайте новую таблицу tbl1, без индексов, тригеров, констрейнов, и проделаете это на ней. Полученное время, я думаю, будет приблизительно минимальным из достижимых для так сформулированой задачи
Re[4]: Расскажите об опциях рекордсета ADODB плиз.
Здравствуйте, maxidroms, Вы писали:
M>//Цикл из 5000 итераций M>lpConn->Execute(_bstr_t("Insert into table...."),0,ADODB::adCmdText); M>//Конец цикла из 5000 итераций
надо сделать транзакцию
до цикла вызвать begin transaction
после цикла commit
и выполняться будет 0 сек.
Re[4]: Расскажите об опциях рекордсета ADODB плиз.
BA>надо сделать транзакцию BA>до цикла вызвать begin transaction BA>после цикла commit BA>и выполняться будет 0 сек.
Ага. Только надо еще не забыть в цикле вызывать AddNew и Update...я проверил... время равно сильно тому что с BatchUpdate.
Просто транзакция поможет в случае ошибки откатить назад
Re[5]: Расскажите об опциях рекордсета ADODB плиз.
Здравствуйте, maxidroms, Вы писали:
M>Ага. Только надо еще не забыть в цикле вызывать AddNew и Update...я проверил... время равно сильно тому что с BatchUpdate. M>Просто транзакция поможет в случае ошибки откатить назад
если мы о куске на который я ответил:
M>//Цикл из 5000 итераций M>lpConn->Execute(_bstr_t("Insert into table...."),0,ADODB::adCmdText); M>//Конец цикла из 5000 итераций
то не надо никаких AddNew и Update.
И ваще о каком движке мы говорим. Если это Access, то забудь про скорость, не увеличишь.
Если это MS SQL, то я готов носом в клаву тыкать — есть ошибка!
Можешь сделать пример покороче и найдем твою ошибку!