Ajouter plus de données et analyser le tri
Ajoutons plus de données pour rendre l'analyse du plan de requête (query plan) plus significative. Insérez les données suivantes dans la table employees
:
INSERT INTO employees (first_name, last_name, email, department) VALUES
('Alice', 'Johnson', '[email protected]', 'HR'),
('Bob', 'Williams', '[email protected]', 'Finance'),
('Charlie', 'Brown', '[email protected]', 'IT'),
('David', 'Miller', '[email protected]', 'Sales'),
('Eve', 'Wilson', '[email protected]', 'Marketing'),
('John', 'Taylor', '[email protected]', 'Engineering'),
('Jane', 'Anderson', '[email protected]', 'HR'),
('Robert', 'Thomas', '[email protected]', 'Finance'),
('Emily', 'Jackson', '[email protected]', 'IT'),
('Michael', 'White', '[email protected]', 'Sales');
Maintenant, analysons une requête plus complexe qui implique un tri. Supposons que vous souhaitiez trouver tous les employés du département 'Sales' et les trier par nom de famille (last name). Vous pouvez utiliser la requête suivante :
SELECT * FROM employees WHERE department = 'Sales' ORDER BY last_name;
Analysez le plan de requête :
EXPLAIN QUERY PLAN SELECT * FROM employees WHERE department = 'Sales' ORDER BY last_name;
La sortie pourrait ressembler à ceci :
QUERY PLAN
`--SCAN employees USING INDEX idx_lastname
Dans ce cas, SQLite effectue un parcours complet de la table (full table scan) puis trie les résultats.
Créons un index sur la colonne department
:
CREATE INDEX idx_department ON employees (department);
Maintenant, analysez à nouveau le plan de requête :
EXPLAIN QUERY PLAN SELECT * FROM employees WHERE department = 'Sales' ORDER BY last_name;
La sortie pourrait changer pour :
QUERY PLAN
|--SEARCH employees USING INDEX idx_department (department=?)
`--USE TEMP B-TREE FOR ORDER BY
Maintenant, SQLite utilise l'index idx_department
pour trouver les employés du département 'Sales', mais il doit toujours trier les résultats.