/ / Klasa pamięci SQLite i wydajność pobierania - sql, sqlite, sqlite3

Klasa pamięci SQLite i wydajność pobierania - sql, sqlite, sqlite3

Powiedzmy, że mam jedną tabelę, która jest tabelą referencyjną (tabela została sprawdzona, a nie aktualizacja).

na przykład schemat tabeli:

CREATE TABLE countries(
zip_code INTEGER PRIMARY KEY,
name TEXT)

Chcę poprawić szybkość pobierania danych. Teraz używam index na namekolumna, ale chcę iść dalej ...

Zmień schemat tabeli:

CREATE TABLE countries(
zip_code INT PRIMARY KEY,
name CHAR(200))

remarque, że zmodyfikowałem typ danych kolumn, aby określić stały rozmiar dla każdej kolumny, a zatem stały rozmiar dla całego wiersza.

Czy to prawidłowe założenie? Myśląc tak wiersze o stałym rozmiarze można wyszukiwać szybciej niż wiersze o dynamicznym rozmiarze w SQLite DBMS.

Inspiruje mnie inne DBMS (MySQL), które pobierają wiersze wielkości statycznej szybciej niż wiersze o dynamicznym rozmiarze

Odpowiedzi:

3 dla odpowiedzi № 1

Naprawiam tę odpowiedź, aby była odpowiednia dla SQLite. Jest zaakceptowana, więc nie mogę jej usunąć.

Nie sądzę, aby przechowywać 200 bajtów dla każdegonazwa przyspieszy twoje zapytanie. W większości baz danych wystarczy pomnożyć ilość przechowywanych danych - ponieważ nazwy są krótsze. W SQLite jest to brak opcji. SQLite przechowuje wszystkie ciągi znaków jako tekst; nie uzupełnia wartości spacjami, jak robią to inne bazy danych.

Nie jestem do końca zaznajomiony z wewnętrznymi elementami SQLite. Ale bazy danych (w tym SQLite) przechowują rekordy strony danych. Są one zarządzane przez mechanizm buforowania. Indeksy identyfikują rekord według strony, na której się znajdują. Cała strona danych zostanie wczytana.

W większości baz danych deklarowanie kolumny jako name(200) prawdopodobnie marnowałby dużo miejsca. Zwiększyłoby to rozmiar rekordu i ma następujące skutki:

  • Na jednej stronie można przechowywać mniej rekordów.
  • Późniejsze pobieranie jest mniej prawdopodobne, aby znaleźć stronę dla rekordu w pamięci podręcznej.
  • Czytanie całego stołu prawdopodobnie zajmie znacznie więcej miejsca w pamięci.
  • Czytanie wiersza wymaga odczytu i przetwarzania większej liczby bajtów.

W SQLite nie ma to zastosowania, ponieważ SQLite po prostu ignoruje długość i nie uzupełnia wartości spacjami.

To, co chcesz zrobić, nie jest dobrym pomysłem w większości baz danych i nie ma żadnego efektu w SQLite. Zalecałbym unikanie takiego podejścia. Indeks powinien wystarczyć.