Réglage
Dans un datawarehouse, je joins une table de faits à 20 dimensions. La table de faits comprend 32 millions de lignes et 30 colonnes. Il s'agit d'une table de transfert temporaire, je n'ai donc pas à traiter avec d'autres utilisateurs lisant ou écrivant sur la table. Je sélectionne 10 colonnes de la table de base et 20 colonnes des dimensions respectives. Les tableaux de dimensions sont petits (entre 3 et 15 000 lignes). Les champs sur lesquels sont joints sont à la fois des entiers et des nvarchars. J'utilise une instruction SELECT ... INTO. Il n'y a pas d'index sur les tables.
La vitesse d'exécution de cette requête est trop lente pour être utile.
Solutions éprouvées
Parce que la requête prend trop de temps à traiter, j'ai essayé les solutions suivantes:
- Divisez les 20 jointures en 4 jointures sur 5 tables. Les performances des requêtes restent cependant faibles.
- Placez des index sur les colonnes de clé étrangère. Pas de diminution significative du temps.
- Assurez-vous que les champs de la condition de jointure sont des entiers. J'ai remarqué une augmentation des performances de 25%. Pas tout à fait ce que je recherche.
- Utilisez une instruction d'insertion dans au lieu de sélectionner dans. Pire performance en raison de la croissance du fichier journal bien que la base de données soit en mode de récupération simple.
Ces résultats m'ont amené à inclure le plan d'exécution réel qui montre que 89% des coûts se trouvent dans l' encart du tableau . Les autres coûts sont 8% d'analyse de table sur la table de faits et 2% sur la correspondance de hachage pour les jointures internes.
Des questions
- Quelles sont les raisons possibles de l'insertion lente de la table?
- Comment identifier ce goulot d'étranglement sans le plan d'exécution?
- Quelles mesures puis-je prendre pour réduire le coût de l'insert de table?