Tous les produits
Search
Centre de documentation

Hologres:Prise en main des index Hologres

Dernière mise à jour :Aug 25, 2026

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.image

  • É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_shipdate pour 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éfinissez l_shipdate comme 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éfinir l_shipdate comme clé de segment.**

  • Pour la requête Q4 : La requête joint la table lineitem à la table orders sur les colonnes l_orderkey et o_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éfinissez l_orderkey comme clé de distribution.**

  • La structure finale de la table lineitem est 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_orderkey de la table orders comme 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_orderdate est 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 orders est 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

Importation de données

Requête de données

Exploitation et maintenance (O&M) et surveillance

Cas d'utilisation et bonnes pratiques

Pratiques et cas d'utilisation : Best practices and classic customer use cases for typical industry scenarios.