База данных QT QSQLD, подключенная к MSSql, извлекает строки ЧРЕЗВЫЧАЙНО медленно

#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]");