Cette rubrique présente les principaux index de Hologres, tels que la clé de distribution, la colonne d'heure d'événement (clé de segment) et la clé de clustering. Elle vous aide à maîtriser les index et à améliorer les performances des requêtes lors du développement sur Hologres.
Fonctionnement de Hologres
Hologres est un entrepôt de données distribué qui utilise le calcul parallèle et vectoriel pour fournir des réponses aux requêtes en quelques secondes. Cette architecture rend la distribution des données cruciale pour les performances. Cela inclut l'équilibrage des données entre les nœuds distribués, régi par la distribution key, ainsi que l'ordre des données au sein des fichiers sur un nœud unique, régi par la event time column (également appelée segment key). Par défaut, Hologres utilise un format de stockage en colonnes pour les scénarios OLAP (traitement analytique en ligne), ce qui rend l'ordre des données dans un fichier, défini par la clustering key, tout aussi essentiel. La maîtrise de ces trois concepts est la clé de l'optimisation des performances. Étant donné que ces propriétés de disposition des données sont définies lors de l'écriture des données et qu'il est coûteux de les modifier, nous vous recommandons de concevoir vos tables avec ces trois attributs dès le départ. Les attributs qui n'affectent pas directement la disposition des données, tels que les bitmap indexes et l'dictionary encoding, peuvent être ajustés ultérieurement selon les besoins.
Hologres utilise une structure de métadonnées à trois niveaux : Database > Schema > Table. Pour éviter les requêtes inter-bases de données, nous vous recommandons de regrouper les tables logiquement liées sous le même schéma. Une base de données constitue une unité de base pour l'isolation des métadonnées, et non pour l'isolation des ressources.
Principes de base de l'optimisation SQL
La conception de tables avec une stratégie de distribution des données appropriée permet aux requêtes SQL de localiser rapidement les données. Cette approche réduit les E/S, consomme moins de ressources de calcul et offre de meilleures performances de requête. Une distribution équilibrée des données garantit également une utilisation efficace des ressources concurrentes, évitant ainsi les goulots d'étranglement ponctuels. Le diagramme suivant illustre la manière dont une requête SQL récupère les données et réduit les E/S.
Élimination des partitions (Partition pruning) : Lorsqu'une requête SQL cible une table partitionnée, l'optimiseur de requête utilise l'élimination des partitions pour localiser les partitions pertinentes. Si les conditions de filtre de la requête n'incluent pas la clé de partition, la requête doit analyser toutes les partitions, ce qui entraîne des E/S excessives. En règle générale, le partitionnement par jour est une bonne pratique. L'élimination des partitions est ignorée pour les tables non partitionnées.
Élimination des shards (Shard pruning) : Utilisez la clé de distribution pour localiser rapidement le shard de données contenant les informations requises. Cela réduit la consommation de ressources pour une seule requête et prend en charge un débit plus élevé pour les requêtes concurrentes. Si un shard spécifique ne peut pas être localisé, le framework distribué planifie tous les shards pour participer au calcul. Cela augmente le parallélisme pour une seule requête, mais utilise davantage de ressources et réduit la concurrence globale. Certains opérateurs nécessitant une exécution centralisée peuvent également introduire une surcharge supplémentaire liée au brassage des données (shuffle). En tant que bonne pratique, choisissez des colonnes avec une distribution de données uniforme, telles que les ID de commande, les ID utilisateur ou les ID d'événement, comme clé de distribution. Si plusieurs tables devant être jointes partagent la même clé de distribution, les données connexes sont collocées sur le même shard. Cela permet des opérations de jointure locale efficaces.
Élimination des segments (Segment key pruning) : Utilisez la clé de segment (colonne d'heure d'événement) pour localiser rapidement le fichier de données spécifique au sein d'un nœud, ce qui évite d'accéder à des fichiers inutiles. Si les données ne peuvent pas être filtrées à ce niveau, tous les fichiers doivent être analysés.
Élimination basée sur la clé de clustering (Clustering key pruning) : Utilisez la clé de clustering pour localiser rapidement les segments de données au sein d'un seul fichier. Cela améliore l'efficacité des requêtes de plage et du tri des colonnes.
Optimisation SQL en pratique
Cette section utilise les requêtes TPC-H pour démontrer comment configurer les index Hologres afin d'améliorer les performances des requêtes. Pour plus d'informations sur TPC-H, consultez le Test plan overview.
Référence SQL TPC-H
Requête TPC-H Q1
La requête TPC-H Q1 effectue des agrégations et des filtres sur des colonnes spécifiques de la table lineitem. Elle inclut la condition suivante :
l_shipdate <= : Il s'agit d'une condition de filtre. Pour prendre en charge un filtrage de plage efficace et récupérer rapidement les données requises, vous devez définir un index approprié.
--TPC-H Q1
SELECT
l_returnflag,
l_linestatus,
SUM(l_quantity) AS sum_qty,
SUM(l_extendedprice) AS sum_base_price,
SUM(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
AVG(l_quantity) AS avg_qty,
AVG(l_extendedprice) AS avg_price,
AVG(l_discount) AS avg_disc,
COUNT(*) AS count_order
FROM
lineitem
WHERE
l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY
GROUP BY
l_returnflag,
l_linestatus
ORDER BY
l_returnflag,
l_linestatus;
Requête TPC-H Q4
La requête TPC-H Q4 joint principalement les tables lineitem et orders. Elle inclut les conditions suivantes :
o_orderdate >= DATE '1996-07-01': Il s'agit d'une condition de filtre. Pour prendre en charge un filtrage de plage efficace et récupérer rapidement les données requises, vous devez définir un index approprié.-
l_orderkey = o_orderkey: Il s'agit d'une condition de jointure entre les deux tables. Pour des performances optimales, utilisez le même index sur les deux tables afin d'activer une jointure locale, ce qui réduit le brassage des données pendant l'opération.--TPC-H Q4 Query SELECT o_orderpriority, COUNT(*) AS order_count FROM orders WHERE o_orderdate >= DATE '1996-07-01' AND o_orderdate < DATE '1996-07-01' + INTERVAL '3' MONTH AND EXISTS ( SELECT * FROM lineitem WHERE l_orderkey = o_orderkey AND l_commitdate < l_receiptdate ) GROUP BY o_orderpriority ORDER BY o_orderpriority;
Recommandations pour la création de tables
Les requêtes Q1 et Q4 impliquent les tables lineitem et orders.
hologres_dataset_tpch_100g.lineitem
Les requêtes Q1 et Q4 impliquent toutes deux la table lineitem, mais elles utilisent des colonnes et des conditions différentes.
Pour la requête Q1 : La requête utilise principalement
l_shipdatepour le filtrage de plage. La clé de clustering accélère les analyses de plage en tirant parti de l'ordre trié des données au sein des fichiers. **Par conséquent, définissezl_shipdatecomme clé de clustering. La clé de segment (colonne d'heure d'événement) maintient l'ordre entre les fichiers. Pour une colonne de date monotone croissante ou décroissante, sa définition comme clé de segment permet une élimination efficace des clés de segment. Par conséquent, vous pouvez également définirl_shipdatecomme clé de segment.**Pour la requête Q4 : La requête joint la table
lineitemà la tableorderssur les colonnesl_orderkeyeto_orderkey. La clé de distribution spécifie la stratégie de distribution des données. Le système place les données ayant la même valeur de clé sur le même shard. Si deux tables appartiennent au même groupe de tables et sont jointes sur leurs colonnes de clé de distribution, le système distribue automatiquement les enregistrements correspondants sur le même shard lors de l'écriture des données. Lorsque ces tables sont jointes, le système effectue une jointure locale sur chaque nœud sans brasser les données sur le réseau. Cela évite le brassage et la redistribution des données au moment de l'exécution, améliorant considérablement l'efficacité d'exécution. **Par conséquent, définissezl_orderkeycomme clé de distribution.**-
La structure finale de la table
lineitemest la suivante :BEGIN; CREATE TABLE hologres_dataset_tpch_100g.lineitem ( l_ORDERKEY BIGINT NOT NULL, L_PARTKEY INT NOT NULL, L_SUPPKEY INT NOT NULL, L_LINENUMBER INT NOT NULL, L_QUANTITY DECIMAL(15,2) NOT NULL, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, L_DISCOUNT DECIMAL(15,2) NOT NULL, L_TAX DECIMAL(15,2) NOT NULL, L_RETURNFLAG TEXT NOT NULL, L_LINESTATUS TEXT NOT NULL, L_SHIPDATE TIMESTAMPTZ NOT NULL, L_COMMITDATE TIMESTAMPTZ NOT NULL, L_RECEIPTDATE TIMESTAMPTZ NOT NULL, L_SHIPINSTRUCT TEXT NOT NULL, L_SHIPMODE TEXT NOT NULL, L_COMMENT TEXT NOT NULL, PRIMARY KEY (L_ORDERKEY,L_LINENUMBER) ) WITH ( distribution_key = 'L_ORDERKEY',--Enables local join. clustering_key = 'L_SHIPDATE',--Accelerates range filtering. event_time_column = 'L_SHIPDATE'--Accelerates segment key pruning. ); COMMIT;
hologres_dataset_tpch_100g.orders
Dans cet exemple, la table orders est utilisée dans la requête Q4.
Définissez la colonne
o_orderkeyde la tableorderscomme clé de distribution pour tirer parti des capacités de jointure locale et améliorer l'efficacité des requêtes de jointure.La colonne
o_orderdateest principalement utilisée pour le filtrage par date. Définissez-la comme clé de segment pour accélérer l'élimination des clés de segment.-
La structure finale de la table
ordersest la suivante :BEGIN; CREATE TABLE hologres_dataset_tpch_100g.orders ( O_ORDERKEY BIGINT NOT NULL PRIMARY KEY, O_CUSTKEY INT NOT NULL, O_ORDERSTATUS TEXT NOT NULL, O_TOTALPRICE DECIMAL(15,2) NOT NULL, O_ORDERDATE timestamptz NOT NULL, O_ORDERPRIORITY TEXT NOT NULL, O_CLERK TEXT NOT NULL, O_SHIPPRIORITY INT NOT NULL, O_COMMENT TEXT NOT NULL ) WITH ( distribution_key = 'O_ORDERKEY',--Enables local join. event_time_column = 'O_ORDERDATE'--Accelerates segment key pruning. ); COMMIT;
Importation des exemples de données
Vous pouvez importer rapidement 100 Go de données TPC-H dans votre instance Hologres en utilisant la fonctionnalité Import public datasets with a few clicks de HoloWeb. Dans HoloWeb, sélectionnez Data Solutions dans la barre de navigation supérieure, puis cliquez sur Import public datasets with a few clicks dans le volet de navigation de gauche. Sur la page de configuration, sélectionnez un Instance Name (par exemple, holo_test) et une Database. Ensuite, sélectionnez tpch_100g dans la liste Public Dataset Name. Le système génère automatiquement un script SQL non modifiable en bas de la page. Ce script comprend des instructions pour créer les schémas hologres_foreign_dataset_tpch_100g et hologres_dataset_tpch_100g, ainsi que pour importer séquentiellement les données dans des tables externes telles que customer, lineitem, nation, orders, part, partsupp, region et supplier.
Résultats des tests de performance
Cette section compare les performances des requêtes avant et après la configuration des propriétés de table recommandées (index).
-
Environnement de test
Spécification de l'instance : 32 cœurs
Type de réseau : VPC
Exécutez chaque requête deux fois à l'aide d'un client PSQL et enregistrez la latence de la deuxième exécution.
-
Conclusion
Pour les requêtes filtrées sur une seule table, la définition de la colonne de filtre comme clé de clustering accélère efficacement la requête.
Pour les requêtes de jointure multi-tables, la définition des colonnes de jointure comme clé de distribution améliore considérablement l'efficacité de la jointure.
Query
Latency with indexes
Latency without indexes
Q1
48 293 ms
59 483 ms
Q4
822 389 ms
3027.957 ms
Références
Plus d'informations
Principes techniques
Approfondissez les principes techniques fondamentaux de Hologres (architecture, moteur de stockage et moteur de calcul) : Core Technology of Alibaba Cloud's Cloud-native Real-time Data Warehouse.
Activation du service
Choix des spécifications : Instance management.
Autorisation des utilisateurs RAM : Quick start for RAM user authorization.
Importation de données
Écritures en temps réel et requêtes de table de dimension avec Flink : Realtime Compute for Apache Flink.
Synchronisation complète en temps réel depuis des bases de données telles que MySQL, Oracle et PolarDB : Configure a MySQL data source.
Importation de données depuis OSS : Accelerate access to OSS data lakes by using DLF.
Utilisez Fixed Plan pour multiplier par 10 l'efficacité de l'écriture et de la mise à jour des données. Pour plus d'informations, consultez la rubrique Accelerate SQL execution by using Fixed Plan.
Requête de données
Recommandations de création de tables pour différents cas d'utilisation : Scenario-based table tuning guide.
Avant de créer des tables, comprenez les paramètres clés tels que
distribution_key,clustering_key,event_time_columnetbitmap_index. L'utilisation d'une syntaxe et d'index appropriés pour définir une structure de table optimale améliore considérablement les performances. Pour plus d'informations, consultez la rubrique CREATE TABLE.Optimisation des performances des tables internes : Optimize query performance.
Accélération MaxCompute : Accelerate MaxCompute data queries by using foreign tables.
Exploitation et maintenance (O&M) et surveillance
Requêtes actives (dépannage des requêtes en cours d'exécution et vérification des verrous existants ou potentiels) : Manage queries.
Requêtes lentes (dépannage des requêtes ayant échoué ou s'exécutant depuis longtemps) : Get and analyze slow query logs.
Séparation lecture/écriture et isolation de la charge : Deploy read/write splitting for primary and secondary instances (shared storage).
Cas d'utilisation et bonnes pratiques
Pratiques et cas d'utilisation : Best practices and classic customer use cases for typical industry scenarios.