Supposons que vous avez une table massive avec trois colonnes comme indiqué ci-dessous:SQL Server - Tables partitionnées et index clusterisé?
[id] INT NOT NULL,
[date] SMALLDATETIME NOT NULL,
[sales] FLOAT NULL
Supposons également que vous êtes limité à un disque physique et un groupe de fichiers (primaire). Vous vous attendez à ce que cette table contienne des ventes pour 10 000 000 ID +, à travers 100 des dates (enregistrements facilement 1B +). Comme avec de nombreux scénarios d'entreposage de données, les données vont généralement croître séquentiellement par date (à chaque fois que vous effectuez une charge de données, vous insérerez de nouvelles dates, et peut-être mettre à jour certaines dates de données plus récentes). À des fins analytiques, les données seront souvent interrogées et agrégées pour un ensemble aléatoire de ~ 10 000 identifiants qui seront spécifiés via une jointure avec une autre table. Souvent, ces requêtes ne spécifient pas les plages de dates, ou spécifient des plages de dates très larges, ce qui m'amène à ma question: Quelle est la meilleure façon d'indexer/partitionner cette table?
J'ai pensé pendant un certain temps, mais je suis coincé avec des solutions contradictoires:
Option 1: Comme les données seront chargées séquentiellement par date, définissez l'index cluster (et clé primaire) comme [ date], [id]. Créez également une fonction/un système de partitionnement "fenêtre glissante" à la date permettant un déplacement rapide des nouvelles données dans/hors de la table. Potentiellement créer un index non-cluster sur ID pour aider à l'interrogation.
Résultat attendu # 1: Cette configuration sera très rapide pour le chargement de données, mais sous-optimale en matière de lecture analytique comme, dans le pire des cas (pas de limitation de dates, de chance avec l'ensemble des id interrogé), 100% des pages de données peuvent être lues. Comme les données ne seront interrogées que pour un petit sous-ensemble d'ID à la fois, définissez l'index clusterisé (et la clé primaire) comme [id], [date]. Ne vous embêtez pas à créer une table partitionnée.
Résultat attendu n ° 2: Atteinte d'une énorme performance attendue lors du chargement de données car nous ne pouvons plus limiter rapidement par date. Bénéfice de performance énorme attendu en ce qui concerne mes requêtes analytiques, car il minimisera le nombre de pages de données lues.
Option 3: En cluster (et clé primaire) comme suit: [id], [date]; fonction/schéma de partition "fenêtre glissante" à la date.
Résultat attendu n ° 3: Je ne sais pas à quoi m'attendre. Étant donné que la première colonne de l'index clusterisé est [id] et donc (d'après ce que je comprends) les données sont classées par ID, je m'attendrais à de bonnes performances de mes requêtes analytiques. Cependant, les données sont partitionnées par date, ce qui est contraire à la définition de l'index clusterisé (mais toujours aligné car la date fait partie de l'index). Je n'ai pas trouvé beaucoup de documentation qui traite de ce scénario et des avantages de performance que cela peut apporter, ce qui m'amène à ma dernière question bonus:
Si je crée une table sur un groupe de fichiers un disque, avec un index clusterisé sur une colonne, y at-il un avantage (en plus de la commutation de partition lors du chargement des données) qui provient de la définition d'une partition sur la même colonne?
Votre dernier point est intéressant. Quel type de bénéfice en termes de performances attendez-vous de la conversion en numérique de float? –
Vous pouvez être plus précis sur les données que vous stockez et le type de données numérique est un nombre exact où un flottant est un nombre approximatif. – GateKiller