ApsaraDB for SelectDB collecte des statistiques par colonne pour aider l'optimiseur basé sur les coûts (CBO) à choisir des plans de requête efficaces. Vous pouvez déclencher cette collecte manuellement ou laisser le système s'en charger automatiquement.
Fonctionnement
Lors de l'optimisation des requêtes, le CBO utilise les statistiques pour estimer la sélectivité des prédicats et comparer les coûts des plans d'exécution. Des statistiques précises permettent de mieux sélectionner les plans et d'accélérer les requêtes.
Toutes les statistiques collectées sont écrites dans la table interne __internal_schema.column_statistics. Avant d'exécuter une tâche de collecte, le frontend (FE) vérifie la disponibilité de tous les tablets de cette table. Si un tablet est indisponible, la tâche est rejetée.
Statistiques collectées par colonne
SelectDB collecte les statistiques suivantes pour chaque colonne :
| Champ | Description |
|---|---|
row_count |
Nombre total de lignes |
data_size |
Taille totale des données |
avg_size_byte |
Longueur moyenne des valeurs en octets |
ndv |
Nombre de valeurs distinctes |
min |
Valeur minimale |
max |
Valeur maximale |
null_count |
Nombre de valeurs nulles |
Choisir une méthode de collecte
Deux méthodes de collecte sont disponibles. Choisissez-en une selon la taille de la table et les exigences de précision de votre charge de travail.
| Méthode | Fonctionnement | Compromis |
|---|---|---|
| Collecte complète | Analyse l'intégralité de la table | Précision maximale ; coût en ressources plus élevé et exécution plus lente |
| Collecte par échantillonnage | Analyse un sous-ensemble de lignes ou un pourcentage de la table | Exécution plus rapide et moins gourmande en ressources ; précision légèrement inférieure |
Pour les tables supérieures à 5 Gio, privilégiez la collecte par échantillonnage afin d'éviter les dépassements de délai et une consommation excessive de mémoire backend (BE).
Collecter les statistiques manuellement
Exécutez l'instruction ANALYZE pour collecter ou actualiser les statistiques à la demande.
Syntaxe
ANALYZE < TABLE | DATABASE table_name | db_name >
[ (column_name [, ...]) ]
[ [ WITH SYNC ] [ WITH SAMPLE PERCENT | ROWS ] ];
Paramètres
| Paramètre | Description |
|---|---|
table_name |
Table à analyser. Utilisez le format database_name.table_name pour spécifier la base de données. |
column_name |
Colonnes à analyser. Séparez les noms de colonnes par des virgules. |
WITH SYNC |
Exécute la tâche de manière synchrone et renvoie le résultat une fois terminée. Sans cette option, la tâche s'exécute de manière asynchrone et renvoie un ID de tâche. |
WITH SAMPLE PERCENT | ROWS |
Active la collecte par échantillonnage. Spécifiez un ratio d'échantillonnage (pourcentage) ou un nombre fixe de lignes. |
Exemples
Collectez des statistiques en échantillonnant 10 % des lignes :
ANALYZE TABLE lineitem WITH SAMPLE PERCENT 10;
Collectez des statistiques en échantillonnant 100 000 lignes :
ANALYZE TABLE lineitem WITH SAMPLE ROWS 100000;
Configurer la collecte automatique
La collecte automatique est activée par défaut. Après la validation de chaque transaction d'importation, SelectDB recalcule l'état de santé des statistiques des tables concernées et déclenche des tâches de collecte si nécessaire.
Fonctionnement du score de santé
L'état de santé des statistiques correspond à une valeur comprise entre 0 et 100. La collecte automatique se déclenche lorsque toutes les conditions suivantes sont remplies :
La table a été mise à jour depuis la dernière collecte.
Le score de santé est passé sous le seuil configuré.
Pour les tables volumineuses : l'intervalle minimal de collecte s'est écoulé depuis la dernière collecte.
Détails du score de santé :
Une table sans statistiques possède un score de santé de 0.
Après chaque transaction d'importation, SelectDB estime le nouveau score de santé selon la proportion de lignes mises à jour.
Si le score descend sous
table_stats_health_threshold(valeur par défaut : 60), la table est considérée comme obsolète et planifiée pour une collecte.
Stratégie pour les tables volumineuses
Pour les tables dont la taille dépasse huge_table_lower_bound_size_in_bytes (valeur par défaut : 5 Gio) :
SelectDB utilise automatiquement la collecte par échantillonnage, en prélevant
huge_table_default_sample_rowslignes (valeur par défaut : 4 194 304).La collecte s'exécute au maximum une fois par intervalle
huge_table_auto_analyze_interval_in_millis(valeur par défaut : 12 heures), indépendamment des variations du score de santé durant cette période.
Pour augmenter la profondeur d'échantillonnage et obtenir des statistiques plus précises, augmentez la valeur de huge_table_default_sample_rows.
Limiter la collecte aux heures creuses
Pour éviter d'impacter les charges de travail de production, définissez une plage horaire pour la collecte automatique :
SET auto_analyze_start_time = '02:00:00';
SET auto_analyze_end_time = '06:00:00';
Désactiver la collecte automatique
SET enable_auto_analyze = false;
Catalogue externe
La collecte automatique est désactivée par défaut pour les catalogues externes afin d'éviter une consommation excessive de ressources liée aux jeux de données historiques volumineux. Activez-la ou désactivez-la par catalogue :
-- Enable automatic collection for an external catalog
ALTER CATALOG external_catalog SET PROPERTIES ('enable.auto.analyze'='true');
-- Disable automatic collection for an external catalog
ALTER CATALOG external_catalog SET PROPERTIES ('enable.auto.analyze'='false');
Gérer les tâches de collecte
Consulter les tâches de collecte
SHOW [AUTO] ANALYZE < table_name | job_id >
[ WHERE [ STATE = [ "PENDING" | "RUNNING" | "FINISHED" | "FAILED" ] ] ];
| Paramètre | Description |
|---|---|
AUTO |
Affiche l'historique des tâches de collecte automatique. Par défaut, seules les 20 000 dernières tâches automatiques terminées sont conservées. |
table_name |
Filtre par table. Utilisez le format database_name.table_name. Renvoie toutes les tâches si omis. |
job_id |
Filtre par ID de tâche. L'ID de tâche est renvoyé lors de l'exécution de ANALYZE en mode asynchrone. Renvoie toutes les tâches si omis. |
Exemple :
SHOW ANALYZE 245073\G;
*************************** 1. row ***************************
job_id: 245073
catalog_name: internal
db_name: default_cluster:tpch
tbl_name: lineitem
col_name: [l_returnflag,l_receiptdate,l_tax,l_shipmode,l_suppkey,l_shipdate,
l_commitdate,l_partkey,l_orderkey,l_quantity,l_linestatus,l_comment,
l_extendedprice,l_linenumber,l_discount,l_shipinstruct]
job_type: MANUAL
analysis_type: FUNDAMENTALS
message:
last_exec_time_in_ms: 2023-11-07 11:00:52
state: FINISHED
progress: 16 Finished | 0 Failed | 0 In Progress | 16 Total
schedule_type: ONCE
Champs de sortie :
| Champ | Description |
|---|---|
job_id |
ID de la tâche |
catalog_name |
Nom du catalogue |
db_name |
Nom de la base de données |
tbl_name |
Nom de la table |
col_name |
Colonnes analysées |
job_type |
Type de tâche : MANUAL ou AUTO |
analysis_type |
Type de statistiques |
message |
Informations sur la tâche de collecte de statistiques |
last_exec_time_in_ms |
Horodatage de la dernière exécution |
state |
État de la tâche : PENDING, RUNNING, FINISHED ou FAILED |
progress |
Détail de l'avancement des tâches |
schedule_type |
Méthode de planification : ONCE pour les tâches ponctuelles |
Consulter les statistiques au niveau de la table
SHOW TABLE STATS <table_name>;
Exemple :
SHOW TABLE STATS lineitem\G
*************************** 1. row ***************************
updated_rows: 0
query_times: 0
row_count: 6001215
updated_time: 2023-11-07
columns: [l_returnflag, l_receiptdate, l_tax, l_shipmode, l_suppkey, l_shipdate,
l_commitdate, l_partkey, l_orderkey, l_quantity, l_linestatus, l_comment,
l_extendedprice, l_linenumber, l_discount, l_shipinstruct]
trigger: MANUAL
Champs de sortie :
| Champ | Description |
|---|---|
updated_rows |
Nombre de lignes mises à jour par la dernière instruction ANALYZE |
query_times |
Réservé ; indiquera le nombre de requêtes dans une version ultérieure |
row_count |
Nombre de lignes de la table. Cette valeur n'indique pas le nombre exact de lignes au moment de l'exécution. |
updated_time |
Date de la dernière mise à jour des statistiques |
columns |
Colonnes pour lesquelles des statistiques ont été collectées |
trigger |
Mode de déclenchement de la dernière collecte |
Consulter l'état des tâches au niveau des colonnes
Chaque tâche de collecte génère une sous-tâche par colonne. Pour consulter l'état des tâches associées à une collecte spécifique :
SHOW ANALYZE TASK STATUS [job_id]
Exemple :
SHOW ANALYZE TASK STATUS 20038;
+---------+----------+---------+----------------------+----------+
| task_id | col_name | message | last_exec_time_in_ms | state |
+---------+----------+---------+----------------------+----------+
| 20039 | col4 | | 2023-06-01 17:22:15 | FINISHED |
| 20040 | col2 | | 2023-06-01 17:22:15 | FINISHED |
| 20041 | col3 | | 2023-06-01 17:22:15 | FINISHED |
| 20042 | col1 | | 2023-06-01 17:22:15 | FINISHED |
+---------+----------+---------+----------------------+----------+
Consulter les statistiques des colonnes
SHOW COLUMN [cached] STATS table_name [ (column_name [, ...]) ];
| Paramètre | Description |
|---|---|
cached |
Affiche les statistiques actuellement en cache dans la mémoire du FE |
table_name |
Table à inspecter. Utilisez le format database_name.table_name. |
column_name |
Colonnes à inspecter. Séparez les noms de colonnes par des virgules. |
Exemple :
SHOW COLUMN STATS lineitem(l_tax)\G
*************************** 1. row ***************************
column_name: l_tax
count: 6001215.0
ndv: 9.0
num_null: 0.0
data_size: 4.800972E7
avg_size_byte: 8.0
min: 0.00
max: 0.08
method: FULL
type: FUNDAMENTALS
trigger: MANUAL
query_times: 0
updated_time: 2023-11-07 11:00:46
Arrêter une tâche de collecte
KILL ANALYZE job_id;
L'ID de tâche est renvoyé par ANALYZE en mode asynchrone ou récupérable via SHOW ANALYZE.
Exemple :
KILL ANALYZE 52357;
Variables de session et paramètres de configuration du FE
Variables de session
| Variable | Valeur par défaut | Description |
|---|---|---|
auto_analyze_start_time |
00:00:00 |
Heure de début de la fenêtre de collecte automatique |
auto_analyze_end_time |
23:59:59 |
Heure de fin de la fenêtre de collecte automatique |
enable_auto_analyze |
true |
Active ou désactive la collecte automatique |
huge_table_default_sample_rows |
4194304 |
Nombre de lignes échantillonnées pour les tables volumineuses |
huge_table_lower_bound_size_in_bytes |
5368709120 |
Seuil de taille au-delà duquel une table est considérée comme volumineuse (par défaut : 5 Gio) |
huge_table_auto_analyze_interval_in_millis |
43200000 |
Intervalle minimal entre les collectes automatiques pour les tables volumineuses (par défaut : 12 heures) |
table_stats_health_threshold |
60 |
Seuil du score de santé (0–100). Une table est considérée comme obsolète lorsque son score passe sous cette valeur. |
analyze_timeout |
43200 |
Délai d'expiration d'une tâche de collecte, en secondes |
auto_analyze_table_width_threshold |
70 |
Nombre maximal de colonnes qu'une table peut comporter pour participer à la collecte automatique |
Paramètres de configuration du FE
Ces paramètres contrôlent le comportement en arrière-plan. Dans la plupart des cas, les valeurs par défaut suffisent.
| Paramètre de configuration du FE | Valeur par défaut | Description |
|---|---|---|
analyze_record_limit |
20000 |
Nombre maximal d'enregistrements d'exécution de tâches stockés de manière persistante |
stats_cache_size |
500000 |
Nombre maximal de lignes de statistiques mises en cache côté FE |
statistics_simultaneously_running_task_num |
3 |
Nombre maximal de tâches de collecte asynchrones simultanées |
statistics_sql_mem_limit_in_bytes |
2147483648 |
Mémoire BE maximale par instruction SQL allouée à la collecte (par défaut : 2 Gio) |
FAQ
L'erreur « Stats table not available... » apparaît après l'exécution d'ANALYZE
Exécutez SHOW BACKENDS pour vérifier que tous les nœuds BE sont dans un état normal. Si les BE semblent sains, vérifiez l'état des tablets de la table de statistiques interne :
ADMIN SHOW REPLICA STATUS FROM __internal_schema.[tbl_in_this_db];
Assurez-vous que tous les tablets affichent un statut normal. Le FE vérifie la disponibilité des tablets avant d'accepter toute requête ANALYZE et la rejette si un tablet de __internal_schema.column_statistics est indisponible.
Échec de la collecte des statistiques sur une table volumineuse
Privilégiez la collecte par échantillonnage plutôt qu'une analyse complète. Les ressources allouées à ANALYZE sont strictement limitées, et l'analyse complète d'une table volumineuse peut entraîner un dépassement de délai ou épuiser la mémoire du BE :
ANALYZE TABLE <table_name> WITH SAMPLE PERCENT 10;
Ajustez le ratio d'échantillonnage selon la taille de la table et la précision souhaitée.