Lorsque votre table utilise un horodatage métier (tel que l'heure de l'événement ou l'heure de la transaction) pour classer l'âge des données, plutôt que l'heure d'écriture système, vous pouvez configurer LindormTable pour hiérarchiser les données chaudes et froides en fonction de cette colonne. LindormTable archive les lignes entières vers le stockage froid lorsque la valeur de la colonne temporelle personnalisée franchit la limite configurée. Les lignes récentes restent dans le stockage rapide pour des requêtes à faible latence ; les lignes plus anciennes sont déplacées vers le stockage froid afin de réduire les coûts. Comme les données chaudes et froides résident dans la même table, les requêtes acheminent automatiquement les lectures vers le niveau de stockage approprié lorsque vous appliquez un filtre sur la colonne temporelle personnalisée.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Le stockage froid est activé sur votre instance. Pour plus de détails, consultez Activer le stockage par capacité
La version 2.4.3 ou ultérieure de LindormTable. Pour vérifier ou mettre à jour votre version, reportez-vous au Guide des versions de LindormTable et à la procédure pour Effectuer une mise à jour mineure de version
Une connexion établie avec LindormTable via Lindorm-cli. Pour plus de détails, consultez Se connecter et utiliser LindormTable avec Lindorm-cli
La propriété STORAGE_POLICY de la table cible ou de la famille de colonnes n'est pas définie sur
COLD. Une table de stockage froid ne peut pas être utilisée pour la séparation des données chaudes et froides. Pour modifier les propriétés de stockage, consultez Configurer le stockage froid
Contraintes
Cette fonctionnalité est prise en charge uniquement pour Lindorm SQL. Les opérations compatibles HBase ne sont pas prises en charge.
Lorsque la valeur d'une ligne dans la colonne temporelle personnalisée franchit la limite des données chaudes, la ligne entière est archivée vers le stockage froid.
-
La colonne temporelle personnalisée doit satisfaire toutes les conditions suivantes :
Elle doit faire partie de la clé primaire.
Elle ne peut pas être la première colonne de la clé primaire.
Son type de données doit être BIGINT ou TIMESTAMP. Si la colonne n'existe pas, ne contient aucune donnée ou contient des données d'un type incorrect, toutes les données sont écrites dans le stockage chaud.
Configurer la séparation des données chaudes et froides pour une table
Étape 1 : Définir la colonne temporelle personnalisée et la limite de données
Choisissez l'une des méthodes suivantes selon que la table existe déjà ou non.
Méthode 1 : Définir lors de la création de la table
Les exemples suivants créent une table nommée dt avec une limite d'un jour entre les données chaudes et froides, en utilisant la colonne p2 comme colonne temporelle personnalisée.
La colonne temporelle personnalisée (p2 dans ces exemples) doit être une colonne de clé primaire, mais ne peut pas être la première colonne de la clé primaire.
-- Default time unit: milliseconds (ms)
CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk PRIMARY KEY(p1, p2, p3))
WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2');
-- Set time unit to seconds (s)
CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk PRIMARY KEY(p1, p2, p3))
WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2|TIMEUNIT=SECONDS');
-- Set time unit to minutes (min)
CREATE TABLE dt (p1 integer, p2 bigint, p3 bigint, c1 varchar, constraint pk PRIMARY KEY(p1, p2, p3))
WITH(COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=p2|TIMEUNIT=MINUTES');
N'ajoutez pas d'espaces de part et d'autre du signe égal (=) dans CHS_COLUMN. Par exemple, utilisez COLUMN=p2 et non COLUMN = p2. La présence d'espaces provoque une erreur.
|
Paramètre |
Description |
|
|
|
La limite entre les données chaudes et froides, exprimée en secondes. Les données plus anciennes que ce seuil (selon la colonne temporelle personnalisée) sont archivées vers le stockage froid lors de la compaction. Par exemple, |
|
|
|
La propriété de stockage de niveau 2. Définissez-la sur |
|
|
|
La colonne temporelle personnalisée et son unité de temps. Format : |
TIMEUNIT= |
|
|
L'algorithme de compression de la table. Non sensible à la casse. La valeur par défaut est |
Méthode 2 : Ajouter la séparation à une table existante
Utilisez ALTER TABLE pour activer la séparation des données chaudes et froides sur une table créée sans cette option.
-- Enable hot and cold data separation with a one-day boundary, using p2 (default unit: milliseconds)
ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2';
-- Use p2 with time unit set to seconds
ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2|TIMEUNIT=SECONDS';
-- Use p2 with time unit set to minutes
ALTER TABLE dt SET 'CHS' ='86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN' = 'COLUMN=p2|TIMEUNIT=MINUTES';
Vérifier la configuration
Utilisez l'une des méthodes suivantes pour confirmer les paramètres :
Exécutez
SHOW TABLE VARIABLES FROM dt LIKE 'CHS_COLUMN';pour afficher les propriétés de la table.Dans le système de gestion de cluster, accédez à la page Overview et cliquez sur le nom de la table. Dans la zone Current Table Details , vérifiez les valeurs de CHS et de CHS_COLUMN.
Étape 2 (Facultative) : Modifier la configuration
Modifier la limite entre les données chaudes et froides :
ALTER TABLE dt SET 'CHS'='1000';
Modifier la colonne temporelle personnalisée :
ALTER TABLE dt SET 'CHS_COLUMN'='COLUMN=p3';
Étape 3 (Facultative) : Désactiver la séparation des données chaudes et froides
ALTER TABLE dt SET 'CHS'='', 'CHS_L2' = '', 'CHS_COLUMN'='';
Après avoir modifié la limite ou désactivé la séparation, les données ne reviennent pas immédiatement du stockage froid vers le stockage chaud. Le système attend la fin d'une opération de compaction en arrière-plan. Pour ramener immédiatement les données vers le stockage chaud, exécutez manuellement une compaction majeure à l'aide de la commande major_compact.
Configurer la séparation des données chaudes et froides pour un index secondaire
Un index secondaire étant stocké au sein de la table de base, sa configuration s'effectue de la même manière. Les exemples suivants utilisent la table dt créée dans la section précédente.
Pour un index secondaire, CHS_COLUMN doit référencer la même colonne temporelle personnalisée que la table de base. Vous ne pouvez pas spécifier une colonne différente.
Créer un index secondaire avec la séparation activée
Méthode 1 : Définir lors de la création de l'index secondaire
CREATE INDEX idx ON dt (c1) WITH(CHS = '86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN='COLUMN=p2');
Méthode 2 : Ajouter la séparation à un index secondaire existant
-- Enable hot and cold data separation on an existing index
ALTER TABLE `dt.idx` SET 'CHS' = '86400', 'CHS_L2' = 'storagetype=COLD', 'CHS_COLUMN'='COLUMN=p2';
Le nom d'une table d'index secondaire utilise le format NomTable.NomIndex. Comme le point (.) est un caractère spécial, encadrez le nom avec des accents graves (). Par exemple, écrivez dt.idx et non dt.idx.
Modifier ou désactiver la configuration de l'index secondaire
Modifier la limite entre les données chaudes et froides :
ALTER TABLE `dt.idx` SET 'CHS'='10000';
Modifier la colonne temporelle personnalisée :
ALTER TABLE `dt.idx` SET 'CHS_COLUMN'='COLUMN=p2';
Désactiver la séparation :
ALTER TABLE `dt.idx` SET 'CHS'='', 'CHS_L2' = '', 'CHS_COLUMN'='';
Écrire des données
L'écriture de données dans une table pour laquelle la séparation des données chaudes et froides est activée fonctionne de la même manière que pour une table standard. Les données sont initialement stockées dans le stockage chaud (Medium ou Compute-optimized). Une ligne est archivée vers le stockage froid lors de la compaction lorsque la condition suivante est remplie :
Current time - Value of the time column > Value of CHS
Interroger des données
Les données chaudes et froides résident dans la même table. Toutes les requêtes ciblent cette table unique. Lorsque vous appliquez un filtre sur la colonne temporelle personnalisée avec une plage de temps, LindormTable l'utilise pour déterminer s'il faut analyser le stockage chaud, le stockage froid ou les deux, de sorte que la requête ne lit que le niveau pertinent. Sans filtre de plage temporelle, la requête peut accéder aux données froides et le débit est alors limité par la capacité du stockage froid. Pour plus de détails, consultez Limitation du débit de lecture du stockage par capacité.
Pour interroger uniquement les données chaudes lorsque vous ne pouvez pas appliquer de filtre sur la colonne temporelle personnalisée, utilisez l'indicateur _l_hot_only_.
Exemples de requêtes
Requête aléatoire (Get)
-- p2 is the custom time column
SELECT * FROM dt WHERE p1 = 10 AND p2 = 10;
Requête de plage
-- p2 is the custom time column
SELECT * FROM dt WHERE p2 > 10 AND p2 < 1000;
Par défaut, LindormTable n'exécute pas une instruction SELECT identifiée comme une requête inefficace ; il lève plutôt une exception. Pour plus de détails, consultez SELECT.
Interroger uniquement les données chaudes à l'aide d'un indicateur
SELECT /*+ _l_hot_only_(true) */ * FROM dt WHERE p1 > 1;
Exemple : Scénario Internet des Véhicules (IoV)
Dans les scénarios Internet des Véhicules (IoV), la clé primaire se compose généralement de vin (Vehicle Identification Number) et de ts (horodatage). Définissez ts comme colonne temporelle personnalisée. Lors de l'interrogation des données d'un véhicule spécifique sur une plage de temps, LindormTable détermine automatiquement s'il doit accéder au stockage chaud ou froid en fonction des conditions de la requête.
USE test;
CREATE TABLE dt (
vin varchar, ts bigint, c1 varchar, c2 varchar,
constraint pk primary key(vin, ts)
) WITH (COMPRESSION = 'ZSTD', CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=ts');
-- Query data for a specific vehicle within a time range
SELECT * FROM dt WHERE vin = 'xxxx' AND ts > 1675065122000 AND ts < 1675975222000;
FAQ
Si je mets à jour des données froides existantes, les données mises à jour restent-elles froides ?
Oui, si la mise à jour ne modifie pas la valeur de la colonne temporelle personnalisée. Si la valeur change, LindormTable réévalue le statut chaud/froid de la ligne en fonction de la nouvelle valeur.
Par exemple : une table possède les colonnes de clé primaire p1 et p2, ainsi que les colonnes hors clé primaire c1 et c2. Une ligne contient les valeurs p1=row1, p2=Jan-28-2023, c1="c1", c2="c2". Avec une limite d'un jour (CHS) et une date actuelle du 30 janvier 2023, la ligne est froide. La mise à jour de c1 ou de c2 maintient la ligne dans le stockage froid. La mise à jour de p2 au 30 janvier 2023 rend la ligne chaude, et elle redevient froide le 1er février 2023.
Vous ne pouvez pas mettre à jour la valeur d'une colonne temporelle personnalisée qui fait partie de la clé primaire.
Si une ligne ne contient aucune valeur dans la colonne temporelle personnalisée, les données sont-elles séparées ?
Non. Les lignes sans valeur dans la colonne temporelle personnalisée sont conservées dans le stockage chaud.