#sql-server #qt
#sql-сервер #qt
Вопрос:
Я использую QT в Windows 10. Я подключаюсь к MS_SQL server
для извлечения записей, чтобы я мог переместить их в базу данных Postgres.
Я использую QSqlDatabase
класс then QSqlQuery
для извлечения строк. Это шокирующе медленно ~ 2 строки в секунду. Я ожидал, что производительность может быть в 500 раз быстрее, чем эта. Это та производительность, с которой мне приходится иметь дело, или я что-то упускаю?
Вот упрощенная версия того, что я пытаюсь сделать. Это выполняется с частотой около 2 Гц.
int main(int argc, char *argv[])
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC3");
db.setDatabaseName("DRIVER={SQL Server};Server=10.10.1.32;Database=[DB_NAME];Uid=[UID];pwd=[PWD]");
if (!db.open()) return -1;
QSqlQuery query;
bool worked = query.exec("select * from [TABLE_NAME]");
if (!worked) return -2;
while(query.next())
{
QSqlRecord record = query.record();
for(int i = 0; i < query.record().count(); i )
{
QVariant value = record.value(i);
fprintf(stdout, "%st",qPrintable(value.toString()));
}
fprintf(stdout, "n");
}
}
Комментарии:
1. sql тривиален — просто выбирает таблицу (не представление). Работа с небольшими объемами данных. Строка будет намного меньше 1 КБ, если подсчитать все столбцы. Сервер хорошо выполняет этот запрос из пользовательского интерфейса базы данных MS.
2. Я бы также добавил, что обычно я бы не беспокоился о производительности, но мне нужно освободить ~ 100000 строк. Это займет около 14 часов. Я ожидал, что это займет несколько минут. Аналогичные запросы к базам данных Postgres выполняются с такой скоростью.
3. Чтобы уточнить, я не опускал вас. Попробуйте
query.prepare("select * from [TABLE_NAME]");
после объявления и последующего вызоваbool worked = query.exec();
, но я сомневаюсь, что это сильно повысит производительность.4. Странное продолжается. На данный момент я смог извлечь 3000 записей из базы данных ms sql. Это заняло 45 минут. Программа создает сценарий обновления для postgres. выполняется менее чем за 2 секунды. Что-то в основном не так.
Ответ №1:
Ну, мой приятель разобрался во всем. Как оказалось, по умолчанию для QQuery используется двунаправленный курсор — по крайней мере, с драйвером ODBC.
QQuery имеет свойство «Только для пересылки». Установите значение true, и хотя код не ускоряется в 500 раз (как я ожидал), он ускоряется в 250 раз. Да … без преувеличения.
Вот модификация к приведенному выше примеру.
QSqlQuery query;
query.setForwardOnly(true);
bool worked = query.exec("select * from [TABLE_NAME]");