Objectif des index : accélérer l'accès aux données nécessaires à la requête.
SELECT * FROM Employee WHERE EmployeeKey = 1234;
-- En utilisant un index sur EmployeeKey: 1 accès disque.
-- Sans index : nécessaire de scanner toute la table Employee.
Inconvénient : toute mise à jour d'un attribut indexé impose de mettre à jour l'index.
⇒ maintenir trop d'index aboutit à une dégradation des performances.
Bayer, McCreight '72
Caractéristiques :
2t-1
clés.t-1
clés.k
fils contient k - 1
clefs.Bayer, McCreight '72
Comme B-tree, mais les pointeurs vers les données sont uniquement dans les feuilles.
Caractéristiques :
Bayer, McCreight '72
Caractéristique principale : quand la table est triée dans l'ordre de l'index.
De quelle sorte d'index s'agit-il ? B/B+ ? Particularités ?
-- Définir un index B-tree
CREATE INDEX cust_gender_adr_idx ON Customers(gender, address);
SELECT * FROM Customers WHERE address = '36 Quai des Orfèvres';
Avantages :
Faiblesses :
Par exemple, index sur sexe: 1.000.000 rows, ≈ 50% M/F
⇒ 500.000 accès. Table scan plus
rapide.
Autres considérations :
Les index ROLAP typiques incluent :
Idée : coder chaque valeur d'un attribut dans un bitmap (bit-array).
Bitmap index sur attribut $a$ dans relation $R$ ($n$ enregistrements) :
| BookID | Title | Binding | Language | |--------|------------------|-----------|----------| | 3240 | Le Petit Prince | Hardcover | French | | 2211 | Winnie the Pooh | Hardcover | English | | 9754 | Paddington Bear | Paperback | NULL | | 4315 | Pinocchio | Hardcover | Italian | | 2368 | Les Vacances | Paperback | French |
| | Hardcover | Paperback | |-----------|-----------|-----------| | **Row 1** | 1 | 0 | | **Row 2** | 1 | 0 | | **Row 3** | 0 | 1 | | **Row 4** | 1 | 0 | | **Row 5** | 0 | 1 |Représentation binaire
Hardcover: 11010 Paperback: 00101
Les vecteurs de bits sont épars lorsque l'attribut a une haute cardinalité :
Inconvénients :
Avantages :
Faiblesses :
| BookID | Title | Binding | Language | Price | |--------|------------------|-----------|----------|-------| | 3240 | Le Petit Prince | Stapled | French |35 | | 2211 | Winnie the Pooh | Hardcover | English |40 | | 9754 | Paddington Bear | Paperback | NULL |35 | | 4315 | Pinocchio | Stapled | Italian |15 | | 2368 | Les Vacances | Paperback | French |40 |
SELECT * FROM Book
WHERE Binding != 'Stapled'
AND Price BETWEEN 20 AND 40;
Hardcover: 01000 40: 01001 Paperback: 00101 35: 10100 Stapled: 10010 15: 00010 NOT Stapled: 01101 35 OR 40: 11101 ----------------------------------- | NOT Stapled AND (35 OR 40): 01101 | -----------------------------------
Objectif : indexer une relation $R$ sur un attribut $a$ d'une autre relation $R'$.
But : précalculer la(les) jointure(s) pour économiser du temps d'exécution.
Stocker un bitmap sur $R$ pour chaque valeur de $n'$.
| ShopID | BookID | Count | |--------|--------|-------| | 1 | 3240 | 2 | | 1 | 2368 | 1 | | 2 | 3240 | 4 | | 2 | 9754 | 8 | | 2 | 2211 | 5 | | 3 | 9754 | 3 |
| BookID | Title | Binding | Language | |--------|------------------|-----------|----------| | 3240 | Le Petit Prince | Hardcover | French | | 2211 | Winnie the Pooh | Hardcover | English | | 9754 | Paddington Bear | Paperback | NULL | | 4315 | Pinocchio | Hardcover | Italian | | 2368 | Les Vacances | Paperback | French |
Hardcover: 101010 Paperback: 010101
Exemples de commandes SQL :
-- Bitmap index
CREATE BITMAP INDEX binding_ix ON Book(binding);
-- Bitmap join index
CREATE BITMAP JOIN INDEX binding_bjix ON Sales(Book.binding)
FROM Sales, Book WHERE Sales.BookID = Book.BookID;
Note : JOIN INDEX ≠ INDEX JOIN
Requêtes typiques en entrepôt : joignent une grande table de faits avec plusieurs petites tables de dimensions.
Les jointures traditionnelles dans les SGBD se calculent par paires, l'optimiseur choisit l'ordre des jointures pour minimiser la taille des résultats intermédiaires.
Problème : la seule table liée aux autres est la table des Faits.
Approche alternative : calculer d'abord le produit cartésien des dimensions filtrées, puis joindre avec les faits. Plus efficace avec des prédicats très sélectifs.
Bitmap indexes/ bitmap join indexes permettent optimiser de telles requêtes.
Exemple :
Si des index bitmap (ou bitmap join index) sont présents sur toutes les clés étrangères nécessaires dans la table de faits, Oracle peut utiliser la "star transformation".
Étapes :
Paramètre à régler : STAR_TRANSFORMATION_ENABLED = true
.
DB2 a une approche similaire, mais utilise un semijoin par dimension avec un B-tree sur les FKs au lieu de bitmaps.
La plupart du temps, les tables d'une base de données ne sont pas stockées dans un ordre particulier (heap-organized table).
Index-organized-table (Oracle) : un B+-tree contient directement les données de la table, ce qui économise une indirection (le chargement du bloc de donnée).
Autres indexes sur la table ne stockent qu'un logical ROWID.
Exemple de création d'une table organisée par index :
-- Creating an index-organized table
CREATE TABLE FrenchCities (
zip int PRIMARY KEY, city_name VARCHAR2(20)
)
ORGANIZATION INDEX
MAPPING TABLE; -- optional, creates a table mapping logical rowids
-- the mapping table is necessary to support bitmap indexes
Objectif : grouper des tables qui partagent des colonnes et sont souvent interrogées ensemble dans un table cluster.
-- Creating a clustered table
CREATE CLUSTER personnel(department NUMBER(4));
CREATE TABLE dept_10
CLUSTER personnel (department_id)
AS SELECT * FROM employees WHERE department_id = 10;
CREATE CLUSTER personnel(department NUMBER(4))
HASHKEYS 10;
-- HASHKEYS est idéalement à peu près le nb de valeurs unique
-- des options permettent de redéfinir fonction de hash, espace de stockage...
Avantages :
Faiblesses :
Un index multicolonne serait coûteux et inutile si l'on ne filtre pas sur un préfixe de la clé.
Le multidimensional clustering stocke des tuples proches sur les colonnes du cluster à proximité.
Réorganisation d'une table en une table groupée
-- Creating an attribute-clustered table
CREATE TABLE sales (
prod_id NUMBER(6) NOT NULL,
cust_id NUMBER NOT NULL,
time_id DATE NOT NULL,
amount_sold NUMBER(10,2) NOT NULL
)
CLUSTERING BY INTERLEAVED ORDER (time_id, prod_id, cust_id);
-- CLUSTERING BY LINEAR ORDER (time_id, prod_id,cust_id);
Il est possible d'ajouter du clustering d'attributs pour les jointures :
-- Join attribute clustering
ALTER TABLE sales
ADD CLUSTERING
sales JOIN product ON (sales.prod_id=products.product_id)
BY INTERLEAVED ORDER (time_id, product_cat);
Avantages :
Faiblesses :
Clustering dans différents SGBD :
Note : la Z-curve est aussi utilisée pour des objets spatiaux dans Oracle, SQL Server, et DB2.
Pour les informations multidimensionnelles ou spatiales :
IBM DB2 a un outil similaire.
Les zone maps sont des structures d'index qui stockent les valeurs min/max de chaque colonne pour chaque zone.
EXPLAIN (ANALYZE, FORMAT JSON) ...