SQLite
Abstract
Titel
SQLite
Abstract
Vrijwel iedereen gebruikt het (onbewust) als eindgebruiker.Maar wanneer en hoe gebruik je het als ontwikkelaar? En wanneer niet? Is het een alternatief voor de grote monsters?
ˈsiːkwəˌlaɪt ?

ˌɛsˌkjuːˌɛlˈaɪt ?
Uitspraak Niemand weet het. Wie kent het? Waar gebruik je het voor? Waar associeer je het mee? - wie kent het? - wie heeft het wel eens gebruikt? - vraag aan niet gebruiker: waar associeer je het mee? - vraag aan gebruiker: bevalt het? nadelen/voordelen? vragen vooraf (tijdens phonetisch, probeer iemand te ontlokken hoe je het uitspreekt door het zelf niet uit te spreken)
Joris Zwart logo
Over Joris Wie? Mijn naam is Joris Zwart (1974) woonachtig in Lent (boven Nijmegen) met mijn lieftallige gezin. Online ben ik te vinden op joriszwart.nl. Waar? Ex-Planonner (2005 – 2009). PlanonNet (PSS2?), PlanonTalk, reserveringen (express, outlook), SAP support calls.
Lies, damned lies, benchmarks.
Benchmark
INSERTs   : 1.000.000
Duration  :    1.357s
---------------------
INSERTs/s : ~ 737.000
Mac mini M1 2022, 16 GB, SSD (dat laatste is belangrijk).
$ go run bench.go
$ sqlite3 bench.sqlite
> select count(*) from data;    -- sqlite doet geen statistics (om te veel btree rewriting te voorkomen) dus table scan maar nog steeds retesnel
> explain query plan select count(*) from data;
> select * from data limit 0, 10;
> select * from data limit 999990, 10;
show some lies (benchmarks) -> insert.go (~100.000 prepared, wal-mode vs transaction etc), select.go (same, then indexed maybe). Do not compare with others (but state 2-10x :-))
Small. Fast. Reliable.
Klopt dat?

Ja, mits... WAL-mode, indexen en transactions

Tenzij..., heavy writing.

ACID, auteurs garanderen dat het nog minimaal 50 jaar meegaat (hoe dan? C :-))

Meest getest? Miljoenen regels testcode. Op allerlei exections points (WAT als ik NU de stroom er af haal? Gelden de ACID-principes nog steeds? Diep onderzoek naar filesystemen en hun issues.

Oorsprong Dr. Hipb. 2000. Ik kwam er zelf mee in aanraking rond 2003. Officieel archive format (check dit) Auteurs: alternatief voor fopen() (C file open), maar daar doen ze zichzelf tekort IMHO.
Write-Ahead Log
Details Readers blokkeren elkaar niet en worden niet geblokkeerd door writers. Writers blokkeren elkaar. Ergo: single-writer. Je kan split reading/writer doen. Busy timeout is van belang, want default erg kort.
PRAGMA journal_mode = WAL
Meer pragma's
PRAGMA journal_mode = WAL;
PRAGMA busy_timeout = 5000;
PRAGMA synchronous = NORMAL;
PRAGMA cache_size = 1000000000;
PRAGMA foreign_keys = true;
PRAGMA temp_store = memory;
Caveat: heavy writing
Caveat: scaling
Five data types
Eenvoud Vergelijk met Big Monsters: text, blob, varchar, nvarchar, int(1), int(11). ( ͡ಠ ʖ̯ ͡ಠ) column affinity strict tables
INTEGER
REAL
TEXT
Encoding Standaard UTF-8, maar pragma mogelijk (wil je niet, denk ik)
BLOB
Details Binary Large Objects (afbeeldingen, documenten (pdf, docx), apps) Blob API
NULL
Yep, het is een type. Don't ask, maar dit heeft te maken met column affinity.
Features
Relational database
Document database
JSON/JSONB + calculated indexen
Columnar database
Ugly hack Tabel per kolom *of* verticale opslag.
Zero configuration
True Maar WAL-mode én foreign keys! Verder tunen (cache-size etc) kan altijd en loont ook.
Embedded library
Details Library, geen standalone (server)applicatie. Self-contained. In-process. Geen socket of netwerkoverhead.
Small footprint
Size 500 kB – 1 MB MySQL installer: 2 MB (enkel de installer)
ACID compliant
Foreign keys, ha!
Mental note Wel even aanzetten (bij iedere connectie).
Modern SQL
N+1 problems
Problem?! Geen probleem!
Window functions
BLOB API
Details Streamend schrijven en lezen van blobs. Afbeeldingen *in* de database is hiermee geen anti-pattern meer en zelfs aan te bevelen; referentiele integriteit op je assets.
JSON and JSONB
Language bindings
Details Vrijwel elk taal heeft bindings. C, C++, C#, Java, JavaScript, Python, Haskell etc.
:memory:
Toepassingen Cache (smart querying), (unit) testing.
Extensions
Authorization
Compression
Encryption
Full-text search
FTS5 Zie ook mijn artikel over het indexeren van docx gebruik makende van het feit dat het eigenlijk XML-bestanden zijn.
Geospatial
Transactional DML
Waarom belangrijk? Data Manipulation Language Omdat je niet een half mislukte migratie wilt terugdraaien.
SQLite
vs
Big Monsters
<spoiler> Absoluut! in 99.214% van de gevallen. We zijn geen MANGA.
Must haves
Hints voor integriteit en performance: WAL-mode Foreign keys Strict tables De rest is up to you (cache, PRAGMA synchronous = NORMAL, be careful depending on your OS)
Who feels inspired?
Aanbod Ik zelf ben er zeer enthousiast over en is het mijn go-to database platform. Wie gaat er mee experimenteren? Vingers? Als je het serieus overweegt: ik ben er graag om je te helpen (om niets).
joriszwart.nl/sqlite