J'ai une table avec environ 1 à 5 millions d'enregistrements. Une petite partie de ces enregistrements a une colonne de bits définie sur «VRAI». Besoin de trouver rapidement ces enregistrements. Je pense que l'index peut accélérer la recherche sur cette colonne, mais j'ai peur des INSERT. D'où ma question.
La base de données fonctionne comme une sorte d'entrepôt de données, il y a donc de nombreux SELECT et de petits INSERT (jusqu'à 10-20 par jour) mais assez grands (jusqu'à 200 000 enregistrements à la fois). J'ai peur du temps plus long de ces importations dans la base de données.
sql-server
sql-server-2005
marioosh
la source
la source
Réponses:
Un index sur un bit pour 1 million d'enregistrements est inutile. L'optimiseur ne l'utilisera jamais, vous ne payez que pour le maintenir. Une bien meilleure alternative consiste à ajouter ce bit comme clé la plus à gauche sur l'index clusterisé.
Mais je vais faire un tir aveugle dans l'obscurité et deviner que ce que vous avez est un modèle de file d'attente: les enregistrements sont déposés dans la table avec le bit défini sur 'TRUE' (c'est-à-dire 'needsprocessing = true'), puis un processus d'arrière-plan semble pour ces enregistrements, effectue un certain traitement et met à jour le bit sur FALSE. Il s'agit d'un modèle omniprésent, également connu sous le nom de «modèle de recette de catastrophe de performance». Je recommanderais de déposer les enregistrements dans la table et de déposer une notification (pourrait être aussi simple que l'ID d'enregistrement nouvellement inséré), en même temps, dans une file d'attente . Voir Utilisation de tables comme files d'attente .
la source
Comme l'a dit @MartinSmith, si vous effectuez une mise à niveau vers SQL 2008, un index filtré serait la solution parfaite. Cependant, dans le même temps, comme un cas général, TOUT index ajouté augmentera votre temps de chargement. Les petits index le sont moins que les grands.
Une chose que je regarderais est si vous avez un index existant qui peut être modifié. En supposant que vos requêtes existantes utilisent un index donné, l'ajout de la colonne de bits à la fin de cet index devrait avoir un effet minimal sur les insertions et l'effet positif que vous recherchez sur vos requêtes.
La prochaine chose à regarder est "Dois-je déjà beaucoup d'index?" Il n'y a pas de règle stricte quant à ce qu'est "beaucoup", mais j'utilise généralement une règle de 10 index, c'est la limite, sauf si j'en ai VRAIMENT besoin d'un nouveau.
Dernière pensée, testez-le sur une instance de test. Configurez une table avec quelques millions de lignes, exécutez votre charge dessus, ajoutez votre index puis réexécutez votre charge et voyez si vous remarquez une augmentation significative du temps de chargement.
Vous seul pouvez vraiment décider de ce qui est «significatif». J'ai des machines où l'ajout de 5 minutes au temps de chargement est "significatif" et d'autres où je pouvais voir en toute sécurité une augmentation de quelques heures.
ÉDITER:
Une autre option consiste à partitionner votre table. Vous devrez peut-être utiliser une vue partitionnée si vous n'utilisez pas l'édition Enterprise, mais cela devrait néanmoins vous aider. Vous mettez vos bits 0 dans une partition et vos bits 1 dans une autre. En supposant que vous n'insérez qu'une version ou l'autre, vous pouvez même accélérer vos insertions.
la source