Si j'ai une grande table avec une colonne qui a une plage de valeurs plutôt limitée (par exemple < 100), est-il raisonnable de diviser cette table en plusieurs tables avec des noms liés à cette valeur de colonne?Est-il raisonnable de diviser les données en différentes tables, en fonction d'une valeur de colonne?
Par ex une table comme avec des colonnes:
table "TimeStamps": [Id] [DeviceId] [MessageCounter] [SomeData]
où [DeviceId]
est la colonne « portée limitée » seraient séparés en plusieurs tables différentes:
table "TimeStamps1": [Id] [MessageCounter] [SomeData] table "TimeStamps2": [Id] [MessageCounter] [SomeData] ... table "TimeStampsN": [Id] [MessageCounter] [SomeData]
Le problème que je rencontre avec ma table originale est que trouver un La plus grande valeur de MessageCounter pour certaines valeurs DeviceId prend beaucoup de temps à s'exécuter (voir this post).
Si les tables sont séparées, la recherche d'un nombre de colonnes maximal doit être une opération O (1).
[Modifier]
Juste trébuché sur ce, je pensais le mettre à jour. Avec une configuration correcte des index et des tâches de réorganisation d'index planifiées, j'ai pu obtenir de bonnes performances avec la forme normalisée. Je recommande d'essayer l'outil SSMS Database Engine Tuning Advisor pour chaque requête de goulot d'étranglement, il a été d'une grande aide (pour quelqu'un qui est le travail principal n'est pas la conception de base de données).
Ok, merci beaucoup, il s'est avéré que j'ai commandé les colonnes de mon index composite complètement faux. Déplacer la colonne DeviceId vers le haut de mon index renvoie les résultats instantanément. – Groo
@Groo: Oui, avec les index, l'ordre des colonnes est important. J'ai rencontré le même problème dans le passé. – sleske
+1 Ce type de solution (proposée par Groo) est une sorte de «mesures désespérées». Faire le réglage - en particulier l'accord de l'index - avant d'aller dans ce sens est le chemin à parcourir. –