Russian Qt Forum

Qt => Базы данных => Тема начата: Flakes от Октябрь 07, 2008, 11:53



Название: Объединение запросов в exec()
Отправлено: Flakes от Октябрь 07, 2008, 11:53
У меня есть цикл с кучей query.exec(), и вся проблема что каждый exec() жрет много катастрофически важного времени. Можно ли как копить их в строку и выполнить один exec(), например разделяя запросы ";\n" или что то в этом роде. У меня ничего не вышло, а так хочется!


Название: Re: Объединение запросов в exec()
Отправлено: crossly от Октябрь 07, 2008, 12:01
ч\з \n точно нет.... :).... а процедуркой никак.... ??


Название: Re: Объединение запросов в exec()
Отправлено: Flakes от Октябрь 07, 2008, 12:04
что именно процедуркой?


Название: Re: Объединение запросов в exec()
Отправлено: Alex03 от Октябрь 07, 2008, 12:22
У меня есть цикл с кучей query.exec(), и вся проблема что каждый exec() жрет много катастрофически важного времени.
Если каждый запрос жрёт много времени, то почему Вы думаете что все разом они сожрут меньше времени?
Если запросы идентичны (меняются только данные), как например при вставке большого кол-ва данных в одну таблицу, то полезно один раз выполнить prepare() и потом много раз выполнять bind()/exec(). Впрочем это уже зависит от задачи и используемой СУБД.


Название: Re: Объединение запросов в exec()
Отправлено: Flakes от Октябрь 07, 2008, 12:39
теперь я понял про какую вы процедурку :) Чтож, придется писать сложные запросы, чтоб одним махом все делали


Название: Re: Объединение запросов в exec()
Отправлено: Admin от Октябрь 07, 2008, 12:57
с процедурками сложновато будет
а вот транзакция самое то
типа

Код:
BEGIN;
SELECT * FROM table1;
SELECT * FROM table2;
SELECT * FROM table2;
END;

а процедурки хороши когда логику в базу данных запихать хотим


Название: Re: Объединение запросов в exec()
Отправлено: Tonal от Октябрь 07, 2008, 20:30
Всё зависит от запросов - что они делают и зачем они это делают, а так же от типа сервера.


Название: Re: Объединение запросов в exec()
Отправлено: kirill от Октябрь 08, 2008, 06:22
с процедурками сложновато будет
а вот транзакция самое то
типа

Код:
BEGIN;
SELECT * FROM table1;
SELECT * FROM table2;
SELECT * FROM table2;
END;

Этот код можно забить в query как один запрос? или какой-то другой тип "транзакция" требуется?


Название: Re: Объединение запросов в exec()
Отправлено: Flakes от Октябрь 08, 2008, 07:33
Код:
BEGIN;
SELECT * FROM table1;
SELECT * FROM table2;
SELECT * FROM table2;
END;

Спасибо, про такие не знал!


Название: Re: Объединение запросов в exec()
Отправлено: Admin от Октябрь 08, 2008, 08:03
каждый запрос - это 1 транзакция
но запросы можно объединять
например psql делает 4000 вставок за 1 секунду в 1 транзакции ( наши прикидывали)


Название: Re: Объединение запросов в exec()
Отправлено: Alex03 от Октябрь 08, 2008, 12:30
ТАк и не понял чего надо топикстартеру, но ещё может вот это поможет?
Цитировать
bool QSqlQuery::execBatch ( BatchExecutionMode mode = ValuesAsRows )

Executes a previously prepared SQL query in a batch. All the bound parameters have to be lists of variants. If the database doesn't support batch executions, the driver will simulate it using conventional exec() calls.