From 559338a3105cc0f0deefa1e1cee6ebca32525a42 Mon Sep 17 00:00:00 2001 From: Joel Cavat <jcavat@gmail.com> Date: Wed, 6 Apr 2022 11:34:37 +0200 Subject: [PATCH] Update with INDEX --- sqlite/QUICK-REF-SQLITE.md | 85 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/sqlite/QUICK-REF-SQLITE.md b/sqlite/QUICK-REF-SQLITE.md index c48f3cc..b9d8bad 100644 --- a/sqlite/QUICK-REF-SQLITE.md +++ b/sqlite/QUICK-REF-SQLITE.md @@ -63,14 +63,30 @@ sqlite> DETACH conference # Fermer une base de données # Création d'une base de données -## Création d'un table +## Système de type + +Le système de type de sqlite est très flexible. Il n'est pas nécessaire de préciser un type et celui qui est donné est conseillé, mais non obligatoire (https://www.sqlite.org/flextypegood.html). Il est dès lors possible de créer une table ainsi : `CREATE TABLE Car(immatriculation, color, owner);`. + +Voici un extrait de la documentation officielle (https://www.sqlite.org/stricttables.html): + +"_So an attempt to insert the string '123' results in an integer 123 being inserted. But if the content cannot be losslessly converted into an integer, for example if the input is 'xyz', then the original string is inserted instead_". + +Ce choix est sujet à débats et à mon avis il offre plus d'inconvénients que d'avantages. + +Heureusement, depuis la version 3.37, sqlite offre le mode STRICT pour renforcer le système de type pour chaque table individuellement : `CREATE TABLE t (i INTEGER, t TEXT) STRICT;` (https://www.sqlite.org/stricttables.html). + +Dans ce cas, le typage doit être spécifié, si une conversion implicite n'est pas possible, une erreur est levée. Le type `ANY` peut toutefois être employé pour indiquer qu'une colonne peut comporter différents types. + + +## Création d'un table (préférez les tables strictes) ```sql CREATE TABLE Test ( i INTEGER NOT NULL PRIMARY KEY, t TEXT NOT NULL, - r REAL -) + r REAL, + a ANY +) STRICT; ``` ## Création d'un table avec contraintes @@ -83,7 +99,7 @@ CREATE TABLE Test ( CHECK (j > 0 && j < 100), UNIQUE (j,k), FOREIGN KEY (k) REFERENCES Table(k) -); +) STRICT; ``` ## Suppression d'une table avec ses enregistrements @@ -188,3 +204,64 @@ AS SELECT id_conference, price, title FROM Conference; ... SELECT id, topic FROM conf_price; ``` + +# Index + +Un index est une structure de données additionnelle qui permet d'améliorer les performances des requêtes. La structure utilisée est un B-Arbre. Il offre des performances sur les égalités (=) et les plages de valeurs (`<`, `<=`, `>`, `>=`). + +## Syntaxe générale + +```sql +CREATE [UNIQUE] INDEX index_name +ON table_name(column_list); +``` + +- un index unique (optionnel) n'autorise qu'une valeur pour un attribut ou groupe d'attributs +- des indexes personnalisés peuvent être créer (voir documentation officielle, "Expression-based Index") + + +## Exemple 1 + + +- Recherche efficace d'un email +- Qu'un email ne peut exister dans la table `Person`. + +```sql +CREATE UNIQUE INDEX index_email +ON Person(email); +``` + +## Exemple 2 + +- recherche optimisée sur la ville + +```sql +CREATE INDEX index_conf +ON Hotel(city); +``` + +## Exemple 3 + + +- recherche optimisée sur des plages de dates +- recherche optimisée sur la date de début uniquement +- recherche optimisée sur la date de début ET (suivi de) la date de fin +- non optimisé sur la date de fin uniquement + +```sql +CREATE INDEX index_conf +ON Conference(start_date, end_date); +``` + +## Divers + +- listez les indexes d'une table : `PRAGMA index_list('table_name');` +- supprimer un index: `DROP INDEX [IF EXISTS] index_name;` + +# Explain + +Comprendre l'optimisateur de requêtes à l'aide de : + +```sql +EXPLAIN QUERY PLAN <select expression> +``` \ No newline at end of file -- GitLab