Почему у меня запрос к зашифрованной базе так долго выполняется?

использую вот эту сборку qsqcipher https://github.com/sjemens/qsqlcipher-qt5

вот упрощенный код, как она создается

/------------------------------------------------------------------------------
void Storage::setStorageTypeToSqlite(const QString& db_name /* = QString() */, bool overwrite /* = false */)
{
    qCDebug(logStorage) << __FUNCTION__;

#ifdef ENABLE_PROTECTION_SQLCIPHER
    QSqlDatabase storage_db = QSqlDatabase::addDatabase("QSQLCIPHER", DB_TELEMETRY_COLLECTOR_CLIENT);
#else
    QSqlDatabase storage_db = QSqlDatabase::addDatabase("QSQLITE", DB_TELEMETRY_COLLECTOR_CLIENT);
#endif
    QString name;
    if (db_name.isEmpty())
    {
        name = путь до файлика базы
        storage_db.setDatabaseName(name);
    }
    else
    {
       
    } 

    int cnt = 0;
    do
    {
        bool ok = true;
        if (storage_db.open())
        {
            QSqlQuery query(storage_db);

#ifdef ENABLE_PROTECTION_SQLCIPHER
#include <db_key-service>
// "PRAGMA key=ключ для зашифрованной базы"
        ok &= query.exec(dvl_db_key);
#endif          
    ok &= query.exec("PRAGMA foreign_keys = ON");
    ok &= query.exec("PRAGMA synchronous = OFF"); // странно, этот запрос выполняется больше чем пол секунды в relwithdebinfo, почему???
    ok &= query.exec("PRAGMA journal_mode = OFF");

   // дальше создаю таблицы

}

эта ф-ия отработала почти 700 мс.. но ладно дальше я в коде вызываю вот такую аброкадабру

//------------------------------------------------------------------------------
int Storage::loadTelemetryInfo(const QString& info_name, QString& info_value)
{
    qCDebug(logStorage) << __FUNCTION__;
    info_value.clear();

    QSqlDatabase storage_db = QSqlDatabase::database(DB_TELEMETRY_COLLECTOR_CLIENT);
    if (!storage_db.open()) {
        qCWarning(logStorage) << storage_db.lastError().text();
        return 2;
    }

    QSqlQuery query(storage_db);
#ifdef ENABLE_PROTECTION_SQLCIPHER
#include <db_key.dvl-service>
    query.exec(dvl_db_key);
#endif
// и вот этот вот запрос отработал за пол секунды
// за пол секунды, как так?? при условии, что сам файлик вешает 50 кб!!!!
    bool ok = query.exec(QString("SELECT `value` FROM `info` WHERE `name`='%1';").arg(info_name));
    if (!ok) {
        qCWarning(logStorage) << query.lastError().text();
        return 3;
    }

    if (query.next())  
       info_value = query.value(0).toString();

    return 0;
}

и вот этот вот запрос отработал за пол секунды

за пол секунды, как так?? при условии, что сам файлик вешает 50 кб!!!!

bool ok = query.exec(QString("SELECT `value` FROM `info` WHERE `name`='%1';").arg(info_name));

настройки подключение через клиент (DB BROWSER for SQLITE) довольно простые:

введите сюда описание изображения

интересно еще то, что не все запросы так странно себя ведут, некоторые (большинство отрабатывает быстро)

без cipher все работает шустро Qt 5.15.2 компилятор msvc виндовс 10

upd. Откатил сложность алгоритма, но все равно запрос этот обрабатывается 650 мс, что я считаю слишком много, даже для отладки. База очень маленькая (файлик 50кб)

#ifdef ENABLE_PROTECTION_SQLCIPHER
#include <db_key-service>
        ok = query.exec(dvl_db_key);
#endif
        ok &= query.exec("PRAGMA cipher_default_compatibility = 2");
        
// 655 мс..
        ok &= query.exec("CREATE TABLE IF NOT EXISTS `info` (`name` TEXT NOT NULL PRIMARY KEY, `value` TEXT);");

Ответы (1 шт):

Автор решения: Aptem_f

Потому что sqlcipher4 Подразумевает sha512 c 4kb block size и 256к итераций, убавив число итераций и пожертвовав криптостокойти я ускорил в разы программу!

→ Ссылка