QT QSqlDatabase, подключенный к MSSql, вытягивает строки ЧРЕЗВЫЧАЙНО медленно - PullRequest
0 голосов
/ 23 апреля 2019

Я использую QT на Windows 10 box. Я подключаюсь к MS_SQL server для извлечения записей, чтобы я мог переместить их в базу данных Postgres.

Я использую класс QSqlDatabase, а затем 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, "%s\t",qPrintable(value.toString()));
        }
        fprintf(stdout, "\n");
    }
}

1 Ответ

0 голосов
/ 26 апреля 2019

Ну, друг мой разобрался.Как оказалось, по умолчанию для QQuery используется двунаправленный курсор - по крайней мере, с драйвером ODBC.

QQuery имеет свойство "forwardOnly".Установите значение true, и хотя код не ускоряется в 500 раз (как я и ожидал), он ускоряется в 250 раз.Да ... без преувеличения.

Вот мод для примера выше.

QSqlQuery query;
query.setForwardOnly(true);
bool worked = query.exec("select * from [TABLE_NAME]");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...