Bonjour à tous,

Je viens solliciter vos lumières pour un choix particulièrement cornélien (dû effectivement à mon manque de connaissances en la matière, je l'assume).

Je dois créer un table qui doit stocker des valeurs temporelles et entières pour des capteurs.
La majorité des requêtes qui seront effectuées devront permettre d'effectuer des aggrégats de valeurs (SUM, AVG, ...) sur des périodes de temps définies pour 1 ou N capteur (exemple : somme de toutes les valeurs du capteur 12 entre date A et date B, ou somme de toutes les valeurs entre date A et date B pour les capteurs 10 à 50, groupé par identifiant de capteur). Bref, rien de fantastique.
Ces valeurs de capteurs seront insérées à rythme soutenu (plusieurs centaines par minute), et je prévois environ 500 millions d'insertions sur l'année (à la louche, fourchette haute).
Je n'aurais pas besoin de référencer les données de cette table dans une autre table.
Je sais que chaque couple DeviceId/ValueDate sera absolument unique.

J'ai donc 2 approches pour le choix de la clé primaire.
Soit je fais simplement une clé composite avec DeviceId/ValueDate en tant que clé primaire tel que suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
CREATE TABLE T_Test (
    DeviceId BIGINT,
    ValueDate DATETIME,
    Value INT,
    ValueType TINYINT,
    PRIMARY KEY (DeviceId, ValueDate)
);
En principe, je suis supposé y gagner en terme d'indexation. Mais je risque d'y perdre en performance d'insertion (il faut bien que le SGBD vérifie l'unicité de la paire).

Soit je me fie à mes habitudes, et j'utilise une clé primaire auto incrémentée tel que suit (ce qui m'oblige à créer ensuite un index sur DeviceId/ValueDate) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
CREATE TABLE T_Test (
    Id BIGINT IDENTITY PRIMARY KEY,
    DeviceId BIGINT,
    ValueDate DATETIME,
    Value INT,
    ValueType TINYINT,
    INDEX IX_DeviceId_ValueDate (DeviceId, ValueDate)
);
Mais je risque d'y perdre en performance de lecture (quoique, avec l'index sur la paire, ça devrait pas être pire non ?), et en gestion d'espace (il va bien falloir stocker une colonne bigint en plus, qui a aucun intérêt métier pour moi).

Selon vous, quelle est l'approche la plus optimisée selon mon usage, tant en terme de performances (surtout à la lecture) et d'espace (l'espace disque supplémentaire, le service achat trouve que ça coûte cher).

Je vous remercie d'avance de vos réponses éclairées (et vous présente mes excuses pour mon ignorance).