LINUX.ORG.RU

Прога на Qt + БД SQLite: как сделать бекап из своего софта?

 , ,


1

4

Всем привет.

Есть некая программа-сервис на Qt с базой данных SQLite. Эта программа должна автоматически делать бекапы своей БДшки по шедулеру. Но есть загвоздка, программа ведёт постоянный опрос всяких устройств, реагирует на происходящее с этими устройствами и к программе подключаются АРМы, на которых это происходящее отображается.

Есть ли какие-нибудь вменяемые способы реализовать такое бекапирование? В идеале, только средствами фреймворка, т.е. QtSQL.

Пока навскидку придумалось накостылить класс, который во время копирования файла БД будет у себя складировать все поступающие запросы, а по окончанию процесса их выполнит. Пока БДшка копируется, можно на АРМе крутить юзеру надпись а-ля «внимание, происходит резервное копирование БД» и блокировать интерфейс (со слов «заказчика», вариант допустимый).



Последнее исправление: s3rjke (всего исправлений: 1)
Ответ на: комментарий от Legioner

Глупости

Теоретически то алгоритмы плюс-минус такие же. Но.

Вот я сделал сравнительные замеры, чтобы обсуждение в ДА-НЕТ не скатывалось.

Дано. Две базы PostgreSQL и SQLite. Созданы через функционал Qt SQL. Вот запрос на создание таблиц:

const QString createTablesQuery =
    "CREATE TABLE IF NOT EXISTS test_table ("
    "id SERIAL PRIMARY KEY,"
    "t0 TEXT NOT NULL,"
    "t1 TEXT NOT NULL,"
    "t2 TEXT NOT NULL,"
    "v0 INTEGER NOT NULL,"
    "v1 INTEGER NOT NULL,"
    "v2 INTEGER NOT NULL,"
    "v3 INTEGER NOT NULL,"
    "v4 INTEGER NOT NULL,"
    "v5 INTEGER NOT NULL,"
    "v6 INTEGER NOT NULL,"
    "v7 INTEGER NOT NULL,"
    "v8 INTEGER NOT NULL,"
    "v9 INTEGER NOT NULL,"
    "v10 INTEGER NOT NULL,"
    "v11 INTEGER NOT NULL,"
    "v12 INTEGER NOT NULL,"
    "v13 INTEGER NOT NULL,"
    "v14 INTEGER NOT NULL"
    ")";

Заполнил случайными числами. Там где строки, значения получались из случайных чисел с плавающей точкой путем конвертирования случайного числа в строку.

Диск у меня SSD если что.

Вставил в таблицу в каждой базе 10000000 записей и замерял время вставки каждой записи. Так вот при росте базы роста времени вставки нет ни у SQLite (~2-4мс) ни у PostgreSQL(0-1мс).

А вот далее идет выборка и тут уже интереснее.

Запрос:

const QString selectQuery = "SELECT * FROM test_table where t0 = ''" /*здесь ставлю разные значения*/;

Так вот. Далее буду подставлять в запрос выше значения, соответствующие первой, средней и последней записям в таблицах и измерять в своей программе время выполнения запроса.

Вот результаты:

SQLitePostgreSQL
Первая запись< 1 ms322 ms
Средняя запись460 ms328 ms
Последняя запись880 ms306 ms

Данные значения получены с первого запуска и последующие запуски дают примерно такие цифры. Никаких средних я не находил.

Собственно выводы: получается, что в SQLite выборка похожа на поиск с линейной сложностью, т.е. перебор всех значений, тогда как в PostgreSQL похоже есть хэширование значений, раз уж время выполнения выборки единичных значений примерно постоянная и не зависит от количества записей (если я правильно понимаю). И таким образом просадки по производительности при росте базы SQLite все же будут.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 5)
Ответ на: комментарий от rumgot

Интересное исследование, спасибо.

EXL ★★★★★
()
Ответ на: комментарий от rumgot

Собственно выводы: получается, что в SQLite выборка похожа на поиск с линейной сложностью, т.е. перебор всех значений, тогда как в PostgreSQL похоже есть хэширование значений, раз уж время выполнения выборки единичных значений примерно постоянная и не зависит от количества записей (если я правильно понимаю). И таким образом просадки по производительности при росте базы SQLite все же будут

Прикольный бенч, но, к сожалению, все эти проблемы SQLite решаются ручным checkpoint-ом, желательно с закрытием старых читающих курсоров. Либо отключением WAL.

Ну и я бы заметил, что все-таки масштаб не тот, особенно учитывая SSD (очень маленький). Скорее всего большую часть времени постгрес здесь занимается не относящимися к обработке данных занятиями, вроде парсинга SQL или ввода-вывода в сокет.

byko3y ★★★★
()
Последнее исправление: byko3y (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.