Russian Qt Forum

Qt => Базы данных => Тема начата: Примерный ученик от Февраль 19, 2009, 14:38



Название: Очень долго пишет (1000 записей) PostgreSQL
Отправлено: Примерный ученик от Февраль 19, 2009, 14:38
Проявилась проблема.
Таблица в БД из 20 столбцов.
В нее записывается > 1000 строк с данными.
Используется QSqlCursor.
100 строк ~ 4 cek
1000 строк ~ 45 cek
10000 строк ~ час.

Как с этим можно бороться?


Название: Re: Очень долго пишет (1000 записей) PostgreSQL
Отправлено: Rcus от Февраль 19, 2009, 15:01
/*Кастует телепатию первого уровня и догадывается что речь  идет о Qt 3.3*/
/*Открывает документацию http://doc.trolltech.com/3.3/sql.html#7*/
Цитировать
QSqlCursor operates on a single record at a time. Whenever performing an insert, update or delete using QSqlCursor, only a single record in the database is affected.
/*Кастует телепатию второго уровня и предполагает что проблема во вставке записей по одной*/
На телепатию третьего уровня не хватает маны кода


Название: Re: Очень долго пишет (1000 записей) PostgreSQL
Отправлено: Примерный ученик от Февраль 19, 2009, 15:14
За телепатию - 5 балов.
А как вставлять записи скопом?
Код:
	QSqlCursor sCur("fp");
QSqlQuery sc("select nextval('_s')");  // номер  от последовательности
QSqlQuery scu("select nextval('_i')");  // индекс от последовательности
int jj=0;
for (int i=0;i<2000;i++)
{
sCur.select();
QSqlRecord *buffer = sCur.primeInsert();  // запись для вставки
if (sCur.isActive())
{
QSqlQuery sc("select nextval('_sti')"); 
QSqlQuery scu("select nextval('_indus0')"); 
sc.next();
buffer->setValue("ind",sc.value(0).toInt());
scu.next();
buffer->setValue("ind0",scu.value(0).toInt());
buffer->setValue("namep","tygrgg");
sd.currentDate();
buffer->setValue("date_",sd);
buffer->setValue("tipd",i);
buffer->setValue("razm",i);
buffer->setValue("tipp",13);
buffer->setValue("regkb",14);
buffer->setValue("min_",48.8);
buffer->setValue("max_",148.8);
buffer->setValue("nom",48.8);
buffer->setValue("grad",48.8);
buffer->setValue("ubat1",6.0);
buffer->setValue("ubat2",12.0);
buffer->setValue("ur1",13);
buffer->setValue("ur2",413);
buffer->setValue("parkmin",14);
buffer->setValue("parkmax",15);
buffer->setValue("tipf",1342);
buffer->setValue("pe",0);
buffer->setValue("pind",2);
sCur.insert();
}


Название: Re: Очень долго пишет (1000 записей) PostgreSQL
Отправлено: Rcus от Февраль 19, 2009, 15:21
можно попробовать QSqlDatabase::transaction() до, и QSqlDatabase::commit(). А вообще в PG для вставки множества записей есть команда COPY


Название: Re: Очень долго пишет (1000 записей) PostgreSQL
Отправлено: Примерный ученик от Февраль 19, 2009, 15:46
Транзакция не помогает.
А как использовать COPY - нужно подумать, QSqlCursor вряд ли подойдет...


Название: Re: Очень долго пишет (1000 записей) PostgreSQL
Отправлено: Rcus от Февраль 19, 2009, 17:03
А вот и код. Я не работал с Qt 3, но все же строка sCur.select(); вызывает вопрос о ее применении. В примерах немного подругому происходит вставка


Название: Re: Очень долго пишет (1000 записей) PostgreSQL
Отправлено: Примерный ученик от Февраль 19, 2009, 17:29
А вот и код. Я не работал с Qt 3, но все же строка sCur.select(); вызывает вопрос о ее применении. В примерах немного подругому происходит вставка
Вы чертовски правы...
Работает совсем по другому...
Я гонял туды-суды кучу ненужных данных... ???


Название: Re: Очень долго пишет (1000 записей) PostgreSQL
Отправлено: BaltikS от Февраль 28, 2009, 22:22
Делал так.... Через QSqlQuery..... А сами запросы разделял ;

Типа INSERT INTO .. ()... ;
INSERT INTO .. ()... ;
INSERT INTO .. ()... ;
INSERT INTO .. ()... ;
.....
Работает быстро :)