Tag Archives: przyspieszanie sqlite3

Optymalizacja SQLite3

Wykonywanie transakcji:

Domyślnie  każde wykonanie INSERT/UPDATE w SQLite3 jest oddzielną operacją, zaznaczenie w bazie danych:

BEGIN TRANSACTION;

Spowoduje, że wszystkie operacje po zaznaczeniu tej opcji będą traktowane jako jedna operacja. Warto tę opcję zaznaczyć gdy mamy do wykonania dużo operacji INSERT/UPDATE. Po zakończeniu działań na bazie danych zamykamy transakcję:

END TRANSACTION;

 

Wyłączenie synchronizacji:

Domyślnie SQLite za-pauzuje wykonywanie operacji po wydaniu komendy do systemu operacyjnego o zapisanie danych. To gwarantuje, że dane są zapisane na dysk. Wyłączenie synchronizacji przez użycie:

synchronous = OFF;

Nakazujemy SQLiteowi trzymanie danych w pamięci przed zapisaniem danych i kontynuowanie pracy. Możliwe jest, że baza danych zostanie uszkodzona, jeśli system operacyjny zaliczy błąd lub gdy nieoczekiwanie przerwiesz wykonywanie skryptu (przez Ctrl +Z), zwykłe zatrzymanie skryptu (Ctrl + C) nakazuje serwerowi SQLite zapisać dane do bazy przed zakończeniem programu.

 

 

Notowanie w pamięci:

Rozważmy przechowywanie danych w pamięci RAM przez użycie opcj:

PRAGMA journal_mode = MEMORY;

Twoje transakcje będą dużo szybsze, jednak jeśli stracisz zasilanie, lub skrypt dodający dane wykrzaczy się, baza danych zostanie uszkodzona (testowane).

 

 

Połączenie synchronizacji i trzymania danych w pamięci:

Połączenie obu opcji daje bardzo duże przyspieszenie, jednak znacząco zwiększa ryzyko uszkodzenia pliku z bazą danych:
PRAGMA journal_mode = MEMORY;
PRAGMA synchronous = OFF;

 

 

Zwiększenie cache:

PRAGMA cache_size = -1048576 jeśli przed liczbą całkowitą stoi minus, liczba ta oznacza wtedy ilość bajtów, ile ma zajmować cache w tym uruchomieniu bazy danych, w tym wypadku oznacza to, że cache ma mieć wielkość 1MB, jeśli przed liczbą nie ma znaku to oznacza to ilość stron, domyślnie ilość to 2000.

 

 

Zwiększenie rozmiaru strony:

Zmniejszyć lub zwiększyć można ją przez użycie:

PRAGMA page_size = 2n.

Po znaku równości musi być wynik podniesienia liczby 2 to potęgi całkowitej. Domyślnie ustawione na 8192, może przyjąć wartości od 512 do 65536.

 

 

:inmemory: znane z SQLite API dla C++/C/Perl użyte w SQLite3:

Ustawienie parametru temp_store na 2 nakaże bazie danych przechowywanie wszelkich informacji w pamięci podręcznej komputera, zamiast zapisywać je co krok na dysku, znacznie przyspiesza insercję danych do bazy:

PRAGMA temp_store = 2;

“Matką” tej opcji jest SQLITE_TEMP_STORE=3 użyte do kompilowania serwera SQLite. Parametr kompilacji ustawiony na 3 oznacza, że wszystkie operacje mają być wykonywane w pamięci RAM, całkowicie pomijając używanie plików tymczasowych.

 

Yyymmm… wielotabelowość(?):

Używanie wielu tabel zwiększa czas dostępu do danych i zapisu do bazy. Jeśli Twoja baza danych jest poszerzana systematycznie co jakiś czas, warto dodać pętlę, która np. co miesiąc utworzy nową tabelę, w której będą zapisywane dane przez ten miesiąc. Baza stanie się w ten sposób również bardziej skalowalna.