Index clusterisé à la date

Je suis en train de reconcevoir une database pour un projet, car la version actuelle ne correspond plus à la réalité de son utilisation et cause de sérieux problèmes.

Plusieurs des tables principales sont constituées de cette structure:

  • Identificateur d'object (FK, 4 octets int)
  • Datetime de l'logging (peut être dupliqué pour différents objects)
  • Valeur (float)

À partir d'autres questions (par exemple, l' index clusterisé composite dans SQL Server ), je comprends que les index cluster ne doivent pas être utilisés sur des keys composites, et de preference sur des types de données plus petits.

Les données de ce tableau (plusieurs millions d'loggings et augmentant de 10k par jour) ne sont insérées ou interrogées que sur la base datetime (get la valeur min / max ou toutes les valeurs d'object dans la plage de dates), les mises à jour et les suppressions seulement en dehors des heures d'interrogation. L'ordre des insertions est généralement de plus en plus long, mais de légères différences sont observées et des retards parfois plus importants doivent être insérés. L'ordre d'un champ d'ID potentiel correspondrait correctement à la croissance datetime d'un seul object, mais ne le sera pas en général pour tous les loggings.

Ma question est la suivante: je vois plusieurs façons de faire des keys / index sur ce type de table, mais quelle approche pour les keys fonctionnerait le mieux dans ces cas?

Dans votre cas, cela ne fonctionnera pas pour créer un index clusterisé à une colonne dans votre colonne DATETIME . Les valeurs ne seront pas uniques …

Pour éviter la fragmentation, il est très important que l'index clusterisé soit implicitement sortingé. Le plus simple est une colonne IDENTITY

Lorsque vous créez un index cluster, l'index cluster est la table . C'est – littéralement – la quantité physiquement stockée de données. Cet index inclut implicitement toutes les autres colonnes. Lorsque vous créez un autre index (non clusterisé bien sûr), l'index clusterisé existant servira de table de search.

Avec plusieurs millions d'loggings, vous tombez sur des problèmes d'E / S. De nombreuses pages doivent être chargées pour get toutes les valeurs set. À partir de SQL Server 2012 MS a introduit column store indexes , qui combinent les avantages d'un SGBD relationnel avec la vitesse des systèmes de stockage orientés colonnes. Cet index est stocké dans un bloc qui peut énormément accélérer les requêtes contre datatables de masse! Le prix que vous payez est l'espace disque et les manipulations plus lentes.

Vous pouvez utiliser un index clusterisé 2-cloumn où vous combinez la date (en premier lieu) avec une colonne IDENTITY . Cela va sortinger votre table physiquement dans l'ordre de la date. Cela devrait fonctionner assez vite aussi.

Ce qui vous convient le mieux dépend de nombreux détails: