powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Оптимизация преобразования структуры бд
3 сообщений из 3, страница 1 из 1
Оптимизация преобразования структуры бд
    #38698306
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Может кто подскажет идеи по ускорению конвертации базы
ее размер у пользователей может быть различный от 10 мб до нескольких гиг :)

Цель при старте приложения убить одну таблицу со связью 1-1 и перетащить поле (24 байта) в другую.
Алгоритм конвертации выглядит так

Код: sql
1.
2.
3.
4.
5.
alter table fly_hash_block add column tth char(24);
update fly_hash_block set tth = (select tth from fly_hash fh where fh.id = fly_hash_block.tth_id) where tth is null;
delete from fly_hash_block where tth is null;
create unique index if not exists iu_fly_hash_block_tth on fly_hash_block(tth);
drop table fly_hash;



Тестовая база размером 266 мег (250 тыс записей) и скрипты лежат тут https://yadi.sk/d/lJm6Is3GWj6pj
пока я нашел способ ускорить время обработки путем отключения журнала и снихронизации.
но что-то мне не нравится этот способ т.к. процесс не быстрый и может разрушить базу.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#define FLYLINKDC_USE_FAST_CONVERT
		if (is_table_exists("fly_hash"))
		{
			CFlyLog l_convert_log("[SQLite DB convert]");
#ifdef FLYLINKDC_USE_FAST_CONVERT
			m_flySQLiteDB.executenonquery("pragma synchronous=OFF;");
			m_flySQLiteDB.executenonquery("pragma journal_mode=MEMORY;");
#endif
			safeAlter("ALTER TABLE fly_hash_block add column tth char(24)");
			l_convert_log.step(m_flySQLiteDB.executenonquery("update fly_hash_block set tth = (select tth from fly_hash fh where fh.id = fly_hash_block.tth_id) where tth is null"));
			l_convert_log.step(m_flySQLiteDB.executenonquery("delete from fly_hash_block where tth is null"));
			l_convert_log.step(m_flySQLiteDB.executenonquery("CREATE UNIQUE INDEX IF NOT EXISTS iu_fly_hash_block_tth ON fly_hash_block(tth)"));
			l_convert_log.step(m_flySQLiteDB.executenonquery("drop table fly_hash"));
#ifdef FLYLINKDC_USE_FAST_CONVERT
			if (!g_UseSynchronousOff)
			{
				m_flySQLiteDB.executenonquery("pragma synchronous=FULL;");
			}
			if (!(g_DisableSQLJournal || BOOLSETTING(SQLITE_USE_JOURNAL_MEMORY)))
			{
				if (g_UseWALJournal)
				    m_flySQLiteDB.executenonquery("pragma journal_mode=WAL;");
				else
				   m_flySQLiteDB.executenonquery("pragma journal_mode=PERSIST;");
			}
#endif
		}


--
~PPA() {} //
...
Рейтинг: 0 / 0
Оптимизация преобразования структуры бд
    #38707689
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовать создать fly_hash_block_new с новой структурой, вставить туда нужные данные, грохнуть устаревшие таблицы, переименовать fly_hash_block_new в fly_hash_block, пересоздать констрэйнты и индексы. На большом объёме данных может получиться значительно быстрее.
...
Рейтинг: 0 / 0
Оптимизация преобразования структуры бд
    #38707854
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei.Agalakov,

Я такое не тестил...
а почему думаете, что это будет быстрее?
если база 1 гиг, то после такой операции она распухнет до ~ 2 гигов
VACUUM по такому объему очень накладная операция.
также повышается вероятность проблемы - у юзера не хватит места на диске.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Оптимизация преобразования структуры бд
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]