Dois-je commencer l'indexation dès le début ou lorsqu'un problème de performances survient?
La stratégie d'indexation a tendance à évoluer avec l'émergence de modèles d'utilisation. Cela dit, il existe également des stratégies et des lignes directrices de conception qui peuvent être appliquées dès le départ.
Choisissez une bonne clé de clustering . Vous pouvez généralement déterminer l'index cluster approprié au moment de la conception, en fonction du modèle attendu d'insertions dans une table. Si un cas convaincant émerge pour un changement dans le futur, qu'il en soit ainsi.
Créez vos contraintes principales et autres uniques . Ceux-ci seront appliqués par des index uniques.
Créez vos clés étrangères et les index non cluster associés . Les clés étrangères sont vos colonnes de jointure les plus fréquemment référencées, alors indexez-les dès le début.
Créez des index pour toute requête manifestement hautement sélective . Pour les modèles de requête que vous connaissez déjà, ils seront très sélectifs et utiliseront probablement des recherches plutôt que des analyses.
Au-delà de ce qui précède, adoptez une approche progressive et holistique pour mettre en œuvre de nouveaux index. Par holistique, j'entends évaluer le bénéfice potentiel et l'impact sur toutes les requêtes et les index existants lors de l'évaluation d'un ajout.
Un problème non rare dans les cercles SQL Server est la sur-indexation, à la suite des conseils des indices DMV et SSMS d'index manquants. Aucun de ces outils n'évalue les index existants et vous proposera joyeusement de créer un nouvel index à 6 colonnes plutôt que d'ajouter une seule colonne à un index à 5 colonnes existant.
-- If you have this
CREATE NONCLUSTERED INDEX [IX_MyTable_MyIndex] ON [dbo].[MyTable]
(
[col1] ASC
, [col2] ASC
, [col3] ASC
, [col4] ASC
, [col5] ASC
)
-- But your query would benefit from the addition of a column
CREATE NONCLUSTERED INDEX [IX_MyTable_MyIndex] ON [dbo].[MyTable]
(
[col1] ASC
, [col2] ASC
, [col3] ASC
, [col4] ASC
, [col5] ASC
, [col6] ASC
)
-- SSMS will suggest you create this instead
CREATE NONCLUSTERED INDEX [IX_MyTable_AnotherIndexWithTheSameColumnsAsTheExistingIndexPlusCol6] ON [dbo].[MyTable]
(
[col1] ASC
, [col2] ASC
, [col3] ASC
, [col4] ASC
, [col5] ASC
, [col6] ASC
)
Kimberly Tripp possède d'excellents documents sur la stratégie d'indexation qui, bien que axée sur SQL, s'applique à d'autres plates-formes. Pour les utilisateurs de SQL Server, il existe des outils pratiques pour identifier les doublons comme l'exemple ci-dessus.
Nous pouvons également créer un index temporaire lors de l'exécution d'une requête. Quels sont les avantages et les inconvénients de telles techniques?
Cela ne s'applique généralement qu'aux requêtes rarement exécutées, généralement ETL. Vous devez évaluer:
- Le temps nécessaire pour créer l'index réduit-il le temps d'exécution de la requête?
- Est-ce que la surcharge de maintenance de laisser l'index en place l'emporte sur le temps nécessaire pour créer / supprimer lorsque cela est nécessaire.