Russian Qt Forum

Qt => Базы данных => Тема начата: Bepec от Февраль 25, 2013, 15:46



Название: Sql в Qt (конкретно SQLite)
Отправлено: Bepec от Февраль 25, 2013, 15:46
Уважаемые господа, ответьте на простой вопрос.

QSqlQuery поддерживает множественную вставку в таблицы? Или нет?

PS судя по моему бытию, не поддерживает, что очень странно. Или может есть какой обходной способ множественного добавления?


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Странник от Февраль 25, 2013, 15:53
Есть такой вариант.
Цитировать
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.


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Bepec от Февраль 25, 2013, 17:50
Хм. печальненько что стандартный оператор не поддерживается. Попробую завтра с утреца (рабочий проект).

Огромное спасибо, даже и не подумал что функционал будет так спрятан.


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: carrygun от Февраль 26, 2013, 05:08
execBatch() вроде бы не поддерживается ни одним из драйверов бд в Qt. Там в сырцах банальная циклическая вставка, как написано в описании.


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Bepec от Февраль 26, 2013, 05:57
Увидим попозже :D через часика полтора :D


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Странник от Февраль 26, 2013, 08:58
execBatch() вроде бы не поддерживается ни одним из драйверов бд в Qt. Там в сырцах банальная циклическая вставка, как написано в описании.
SQLITE не поддерживает, да. Но ни одним - это вы погорячились. Поддержка этой фичи есть, к примеру, у OCI. Других действительно не припомню.

Хм. печальненько что стандартный оператор не поддерживается. Попробую завтра с утреца (рабочий проект).
Стандартный - это уровня SQL? Тогда все определяется непосредственно SQLITE, QSqlQuery вообще никаким боком. Многострочный INSERT поддерживается SQLITE с версии что-то около 3.7.11. В моем Qt 5.0.1, к примеру, из коробки идет версия 3.7.7, так что пряники пока недоступны. Как вариант, если очень уж хочется, можно сделать грязный хак:
Код:
INSERT INTO tableName(col1, col2)
SELECT 'val1.1', 'val1.2'
UNION SELECT 'val2.1', 'val2.2'
UNION SELECT 'val3.1', 'val3.2'


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Bepec от Февраль 26, 2013, 09:08
Да, драйверы Qt для sqlite не поддерживают множественной вставки.

Приблизительное сравнение возможностей драйвера Qt и простого подключения библиотеки в проект.

Добавление 13000 хешей файлов:

QSqlQuery - 1760896 мс (29 минут)
sqlite3 - 146 мс(эээ... ноу минут)

PS а я то думал, что это sql такой тормозной :D

(http://www.topito.com/wp-content/uploads/2013/01/code-26.gif)


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Пантер от Февраль 26, 2013, 09:19
Bepec, transaction юзал? ;)


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Bepec от Февраль 26, 2013, 09:25
Конечно. Все добавления шли в транзакции.  (в QSqlQuery)
В случае с sqlite транзакции не использовались. (недоработочка)

PS это пока первое впечатление, сейчас создам тестовый проектик на оба случая. А то мб действительность отличается :D


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Странник от Февраль 26, 2013, 09:26
советую погуглить на тему медленной вставки SQLITE, узнаете много нового.


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Bepec от Февраль 26, 2013, 09:54
Хм. А на чистом проекте показывает практически одинаковые результаты :D

Странно сие. Буду искать проблемку :)

PS гуглил уже, включал различные режимы, отрубал журнал. Выигрыш был, но несущественный.


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Пантер от Февраль 26, 2013, 10:08
Мне для ускорения вставки помогло удаление всех индексов перед вставкой и создание их после.


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: fuCtor от Март 03, 2013, 10:39
Да, драйверы Qt для sqlite не поддерживают множественной вставки.

Приблизительное сравнение возможностей драйвера Qt и простого подключения библиотеки в проект.

Добавление 13000 хешей файлов:

QSqlQuery - 1760896 мс (29 минут)
sqlite3 - 146 мс(эээ... ноу минут)

PS а я то думал, что это sql такой тормозной :D

(http://www.topito.com/wp-content/uploads/2013/01/code-26.gif)


Какие-то нереальные цифры (если конечно не считаете хэши в реалтайме) о_О у себя перегон записей (14000 шт) из одной БД (Mysql) в Sqlite, пачками по 500шт (обернуто в одну транзакцию) c промежуточной обработкой, занимает 15-20сек. Тут больше затраты на сеть уходят, чем на sqlte.
Индексов нет, добавляются потом.


Название: Re: Sql в Qt (конкретно SQLite)
Отправлено: Bepec от Март 03, 2013, 20:28
Да, у меня там был маленький просчёт в замерах. :)

Но тем больше моя радость, когда был показан приятный результат :)