Tous les produits
Search
Centre de documentation

Hologres:Paramètres GUC

Dernière mise à jour :Aug 24, 2026

Hologres prend en charge les paramètres Grand Unified Configuration (GUC) pour contrôler le comportement des requêtes, la gestion des connexions, les performances et la sécurité au niveau de la session ou de la base de données.

Limites

Les paramètres GUC ne s'appliquent pas aux tables système.

Référence des paramètres GUC

Les paramètres sont regroupés par fonction. La colonne Level indique où chaque paramètre peut être configuré : Session (prise d'effet immédiate pour la connexion actuelle) ou Database (prise d'effet après reconnexion).

Auto-analyze

Ces paramètres contrôlent la fonctionnalité auto-analyze, qui collecte automatiquement des statistiques afin de garantir l'exactitude des plans de requête.

Parameter

Description

Default

Level

hg_enable_start_auto_analyze_worker

Active ou désactive auto-analyze.

on (Hologres V1.1+)

Session / Database

hg_auto_check_table_changes_interval

Intervalle auquel Hologres vérifie les modifications dans les tables internes et déclenche auto-analyze.

10min

Session / Database

hg_auto_check_foreign_table_changes_interval

Intervalle auquel Hologres vérifie les modifications dans les tables externes et déclenche auto-analyze.

4h

Session / Database

hg_auto_analyze_max_sample_row_count

Nombre maximal de lignes échantillonnées par exécution d'auto-analyze.

16777216

Session / Database

hg_fixed_api_modify_max_delay_interval

Délai maximal avant qu'auto-analyze ne prenne en compte les modifications effectuées via les API fixes.

3day

Session / Database

Requête de table externe MaxCompute

Ces paramètres optimisent la manière dont Hologres interroge les tables externes MaxCompute. Pour obtenir des conseils d'optimisation, consultez la rubrique Optimiser les performances des requêtes pour les tables externes MaxCompute.

Parameter

Description

Default

Valid values

Level

hg_foreign_table_max_partition_limit

Nombre maximal de partitions atteintes par requête. Une valeur de 0 signifie qu'il n'y a aucune limite.

512 (avant la version V3.0.7) ; 0 (V3.0.7+)

0–1024

Session / Database

hg_experimental_query_batch_size

Nombre de lignes récupérées par lot lors de l'analyse d'une table MaxCompute.

8192

—

Session / Database

hg_foreign_table_split_size

Taille du fractionnement des données (en Mo) pour les lectures parallèles. Évitez de définir une valeur excessivement élevée.

64

—

Session / Database

hg_foreign_table_executor_max_dop

Degré maximal de parallélisme (DOP) pour l'exécution des requêtes.

Nombre de cœurs CPU (max 128)

—

Session / Database

hg_foreign_table_executor_dml_max_dop

DOP maximal pour les opérations DML sur les tables externes.

32

—

Session / Database

hg_enable_access_odps_orc_via_holo

Permet la lecture des fichiers ORC MaxCompute via le lecteur natif Hologres.

on (Hologres V1.1+)

—

Session / Database

Cache de résultats

Parameter

Description

Default

Level

hg_experimental_enable_result_cache

Active la mise en cache des résultats pour les requêtes identiques. Désactivez cette option uniquement si des résultats de cache obsolètes provoquent des problèmes.

on

Session / Database

Optimisation des requêtes sur les tables internes

Ces paramètres permettent d'ajuster l'optimiseur de requêtes pour les tables internes. Pour plus de détails, consultez la rubrique Optimiser les performances des requêtes.

Parameter

Description

Default

Level

optimizer_join_order

Contrôle la manière dont l'optimiseur recherche l'ordre de jointure optimal. Définissez la valeur sur query pour utiliser l'ordre spécifié dans la requête.

exhaustive

Session

optimizer_force_multistage_agg

Force l'agrégation en plusieurs étapes. Activez cette option pour les requêtes avec une cardinalité élevée dans la clause GROUP BY qui présentent de mauvaises performances.

off

Session

Sécurité et chiffrement

Parameter

Description

Default

Level

hg_anon_enable

Active le masquage des données. Configurez ce paramètre au niveau de la base de données afin qu'il s'applique à toutes les sessions.

off

Database (recommandé)

hg_experimental_encryption_options

Active et configure le chiffrement des données au repos. Configurez ce paramètre au niveau de la base de données.

off

Database (recommandé)

Délais d'expiration des requêtes et des connexions

Important

Configurez idle_session_timeout au niveau de la base de données. La valeur par défaut 0 désactive la libération automatique des connexions inactives, ce qui peut épuiser la limite de connexions et entraîner des fuites de connexions.

Parameter

Description

Default

Level

statement_timeout

Annule toute requête active dont la durée d'exécution dépasse la valeur spécifiée. La valeur est exprimée en millisecondes ; 0 désactive le délai d'expiration. Pour plus de détails, consultez la rubrique Gérer les requêtes.

8h

Session (recommandé)

idle_in_transaction_session_timeout

Met fin aux sessions inactives au sein d'une transaction ouverte depuis plus longtemps que la durée spécifiée. La valeur est exprimée en millisecondes ; 0 désactive le délai d'expiration. Configurez ce paramètre au niveau de la base de données pour éviter que les fuites de transactions ne verrouillent la base de données. Pour plus de détails, consultez la rubrique Gérer les requêtes.

10min

Database (recommandé)

idle_session_timeout

Libère les connexions inactives depuis plus longtemps que la durée spécifiée. La valeur est exprimée en millisecondes ; 0 désactive la libération automatique. Pour plus de détails, consultez la rubrique Gérer les connexions.

0 (désactivé)

Database (recommandé)

Conversion de type de données

Parameter

Description

Default

Level

hg_experimental_functions_use_pg_implementation

Bascule la fonction de conversion spécifiée (to_char, to_date ou to_timestamp) vers l'implémentation PostgreSQL, qui prend en charge la plage d'années 0000–9999. L'implémentation Hologres par défaut prend en charge la plage 1925–2282. Pris en charge dans Hologres V1.1.31+. Pour plus de détails, consultez la rubrique Fonction de conversion de type de données.

—

Session / Database

Exemple : Pour étendre la plage d'années pour to_char :

set hg_experimental_functions_use_pg_implementation = 'to_char';

Fonctions d'agrégation

Parameter

Description

Default

Valid values

Level

hg_experimental_approx_count_distinct_precision

Contrôle la précision (et l'utilisation de la mémoire) de la fonction APPROX_COUNT_DISTINCT. Des valeurs plus élevées réduisent la marge d'erreur mais augmentent l'utilisation de la mémoire.

17

12–20

Session / Database

Fuseau horaire

Parameter

Description

Default

Level

timezone

Définit le fuseau horaire pour la session ou la base de données.

GMT-8:00

Session / Database

Opérations sur les tables

Parameter

Description

Default

Level

hg_experimental_enable_create_table_like_properties

Lorsque cette option est activée, CREATE TABLE LIKE copie à la fois le schéma de la table et les propriétés de la table (clé primaire, index). Lorsqu'elle est désactivée, seul le schéma est copié.

off

Session / Database

hg_experimental_affect_row_multiple_times_keep_first

Définit la politique de résolution des conflits INSERT ON CONFLICT pour conserver la première occurrence lorsqu'un lot contient des valeurs de clé primaire en double.

off

Session / Database

hg_experimental_affect_row_multiple_times_keep_last

Définit la politique de résolution INSERT ON CONFLICT pour conserver la dernière occurrence lorsqu'un lot contient des valeurs de clé primaire en double.

off

Session / Database

Réplication et surveillance

Parameter

Description

Default

Level

hg_experimental_enable_read_replica

Active la réplication au niveau des shards.

on

Session / Database

hg_experimental_display_query_id

Affiche l'ID de requête via un message NOTICE sur le client, ce qui vous permet de localiser une requête dans hologres.hg_query_log pour le dépannage. Fonctionne avec HoloWeb, PSQL, JDBC, Python (Psycopg) et d'autres clients. L'ID de requête est renvoyé sous forme de message NOTICE plutôt que comme une colonne dans l'ensemble de résultats. Pour plus d'informations, consultez la section Obtenir l'ID de requête.

off

Session / Database

Vérifier la valeur actuelle d'un paramètre GUC

Exécutez SHOW pour vérifier la valeur actuelle ou par défaut d'un paramètre :

-- Check whether auto-analyze is enabled
SHOW hg_enable_start_auto_analyze_worker;

-- Check the MaxCompute partition limit
SHOW hg_foreign_table_max_partition_limit;

-- Check whether query ID display is enabled
SHOW hg_experimental_display_query_id;

Configurer les paramètres GUC

Configurez les paramètres GUC au niveau de la session ou de la base de données en fonction de la portée du paramètre et de votre cas d'utilisation. Il n'est pas nécessaire de définir tous les paramètres au niveau de la base de données.

Niveau de la session

L'instruction SET configure un paramètre uniquement pour la connexion actuelle. Le paramètre est ignoré lorsque la connexion est fermée. Utilisez la configuration au niveau de la session lorsque le comportement doit s'appliquer à une requête ou à une charge de travail spécifique, et non globalement.

Syntaxe :

set <GUC_NAME> = <VALUE>;

Exemples :

-- Enable auto-analyze for this session
set hg_enable_start_auto_analyze_worker = on;

-- Limit MaxCompute partition hits to 1024 for this session
set hg_foreign_table_max_partition_limit = 1024;

-- Enable query ID display for this session
set hg_experimental_display_query_id = on;

Niveau de la base de données

L'instruction ALTER DATABASE définit un paramètre au niveau de la base de données. La modification s'applique à l'ensemble de la base de données sans redémarrage de l'instance. Votre connexion actuelle doit être fermée puis rouverte pour que la nouvelle valeur prenne effet ; les connexions ouvertes ultérieurement héritent automatiquement du paramètre. Lorsque vous créez une nouvelle base de données, configurez explicitement ses paramètres GUC, car ils ne sont pas hérités automatiquement.

Syntaxe :

alter database <DB_NAME> set <GUC_NAME> = <VALUE>;

Exemples :

-- Enable auto-analyze for all connections to testdb
alter database testdb set hg_enable_start_auto_analyze_worker = on;

-- Limit MaxCompute partition hits to 1024 for all connections to testdb
alter database testdb set hg_foreign_table_max_partition_limit = 1024;

-- Enable data masking for all connections to a database
alter database <DB_NAME> set hg_anon_enable = on;

-- Enable data encryption for all connections to a database
alter database <DB_NAME> set hg_experimental_encryption_options='AES256,623c26ee-xxxx-xxxx-xxxx-91d323cc4855,AliyunHologresEncryptionDefaultRole,187xxxxxxxxxxxxx';

-- Release idle connections after 10 minutes (600,000 ms) of inactivity
alter database <DB_NAME> SET idle_session_timeout = 600000;

Obtenir l'ID de requête

L'ID de requête identifie de manière unique chaque requête dans Hologres et fait partie de la clé primaire du journal des requêtes lentes hologres.hg_query_log. Une fois que vous disposez de l'ID de requête d'une instruction, vous pouvez consulter sa durée, son statut, le nombre de lignes lues et d'autres détails d'exécution. Cela fait de l'ID de requête le point d'entrée principal pour le dépannage.

Par défaut, Hologres ne renvoie pas l'ID de requête au client. Après avoir activé hg_experimental_display_query_id, le serveur renvoie l'ID de requête dans un message NOTICE lors de l'exécution de l'instruction.

Description du paramètre

Item

Description

Parameter

hg_experimental_display_query_id

Effect

Affiche l'ID de requête sur le client dans un message NOTICE lors de l'exécution d'une instruction.

Default value

off

Valid values

on ou off.

Level

Session ou database.

Return format

Un message NOTICE au format QueryID: <QUERY_ID>, par exemple QueryID: 1002002606817130830.

Gardez à l'esprit les deux mécanismes suivants :

  • L'ID de requête arrive dans un message NOTICE, et non comme une colonne dans l'ensemble de résultats. La simple lecture des résultats de la requête (par exemple, avec fetchall()) ne vous permet pas d'obtenir l'ID de requête. Vous devez utiliser le mécanisme NOTICE fourni par votre pilote.

  • Le paramètre s'applique à une seule session et est ignoré lorsque la connexion est fermée ; vous devez donc le définir à nouveau sur chaque nouvelle connexion. Cela est particulièrement important avec les pools de connexions, où l'instruction doit faire partie de l'étape d'initialisation de la connexion. Pour plus d'informations, consultez la section Pools de connexions.

Activer l'affichage de l'ID de requête

-- Session level. Run this together with your business SQL.
set hg_experimental_display_query_id = on;

-- Check the current value.
SHOW hg_experimental_display_query_id;

-- Database level. Applies to new connections; reopen existing connections.
alter database <DB_NAME> set hg_experimental_display_query_id = on;

Récupérer l'ID de requête depuis un client

Java (JDBC)

Dans JDBC, les messages NOTICE arrivent sous forme de chaîne d'objets SQLWarning. Parcourez la chaîne avec statement.getWarnings() après l'exécution de l'instruction et analysez l'ID de requête à partir de celle-ci. L'objet ResultSet ne contient pas l'ID de requête.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HologresQueryIdDemo {

    // Matches "QueryID: <QUERY_ID>" in a NOTICE message.
    private static final Pattern QUERY_ID_PATTERN = Pattern.compile(
            "query[_ ]?id\\s*(?:is\\b|[=:])?\\s*([0-9a-zA-Z_\\-]{6,})", Pattern.CASE_INSENSITIVE);

    public static void main(String[] args) throws Exception {
        // Use the endpoint that matches your network environment (Internet or VPC).
        // Find it on the instance details page in the console.
        String url = "jdbc:postgresql://<ENDPOINT>:80/<DB_NAME>";
        String user = "<ACCESS_KEY_ID>";
        String password = "<ACCESS_KEY_SECRET>";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement()) {

            // Enable query ID display. The parameter is off by default and applies to this session only.
            stmt.execute("set hg_experimental_display_query_id = on;");

            String sql = "select count(*), sum(id) from holo_query_id_demo;";

            // Clear warnings left by the previous statement so that each query ID maps to one SQL statement.
            stmt.clearWarnings();
            boolean hasResultSet = stmt.execute(sql);

            // Read the result set. The query ID is not part of it.
            if (hasResultSet) {
                try (ResultSet rs = stmt.getResultSet()) {
                    while (rs.next()) {
                        System.out.println("rows      : (" + rs.getLong(1) + ", " + rs.getLong(2) + ")");
                    }
                }
            }

            // NOTICE messages arrive as a chain of SQLWarning objects. Walk the chain to parse the query ID.
            String queryId = null;
            List<String> notices = new ArrayList<>();
            for (SQLWarning w = stmt.getWarnings(); w != null; w = w.getNextWarning()) {
                notices.add(w.getMessage());
                Matcher m = QUERY_ID_PATTERN.matcher(w.getMessage());
                if (m.find()) {
                    queryId = m.group(1);
                }
            }

            System.out.println("query_id  : " + queryId);
            System.out.println("notices   : " + notices);
        }
    }
}

Exemple de sortie :

rows      : (1000, 500500)
query_id  : 1002002606817139331
notices   : [One or more columns in the following table(s) do not have statistics: holo_query_id_demo, QueryID: 1002002606817139331]

Notez les points suivants :

  • PreparedStatement fonctionne de la même manière. Appelez pstmt.getWarnings() après l'exécution de l'instruction.

  • Appelez clearWarnings() avant chaque instruction. Sinon, les avertissements s'accumulent sur le même objet Statement et vous ne pouvez plus déterminer à quelle instruction appartient quel ID de requête.

  • Une chaîne NOTICE peut contenir des messages non liés, tels qu'un avertissement indiquant l'absence de statistiques. Recherchez le préfixe QueryID: lors de l'analyse.

Python (Psycopg 3)

Hologres est compatible avec PostgreSQL 11. Utilisez le pilote Psycopg 3, que vous installez avec pip install "psycopg[binary]". Enregistrez un rappel avec conn.add_notice_handler() pour recevoir les messages NOTICE. Les lignes renvoyées par cur.fetchall() ne contiennent pas l'ID de requête.

import re
import psycopg

NOTICES = []
QUERY_IDS = []

QUERY_ID_PATTERN = re.compile(
    r"query[_ ]?id\s*(?:is\b|[=:])?\s*([0-9a-zA-Z_\-]{6,})", re.IGNORECASE
)

def notice_handler(diag):
    """Called once for every NOTICE the server sends. Parses the query ID from it."""
    text = diag.message_primary or ""
    NOTICES.append(text)
    match = QUERY_ID_PATTERN.search(text)
    if match:
        QUERY_IDS.append(match.group(1))

conn = psycopg.connect(
    host="<ENDPOINT>",          # Find it on the instance details page in the console.
    port=80,
    dbname="<DB_NAME>",
    user="<ACCESS_KEY_ID>",
    password="<ACCESS_KEY_SECRET>",
)
conn.autocommit = True
conn.add_notice_handler(notice_handler)   # Register the NOTICE callback.

cur = conn.cursor()
# Enable query ID display. The parameter is off by default and applies to this session only.
cur.execute("set hg_experimental_display_query_id = on;")

def run_sql(sql, params=None, fetch=True):
    """Runs a statement and returns (rows, query_id, notices). rows is None when there is no result set."""
    NOTICES.clear()
    QUERY_IDS.clear()
    cur.execute(sql, params)
    rows = None
    if fetch and cur.description is not None:
        rows = cur.fetchall()
    query_id = QUERY_IDS[-1] if QUERY_IDS else None
    return rows, query_id, list(NOTICES)

rows, query_id, notices = run_sql("select count(*) from holo_query_id_demo;")
print("rows:", rows)
print("query_id:", query_id)

Exemple de sortie. Les instructions DML et les requêtes renvoient toutes deux un ID de requête :

SQL       : insert into holo_query_id_demo select i, 'v' || i from generate_series(1, 1000) i;
query_id  : 1002002606817130830
notices   : ['QueryID: 1002002606817130830']

SQL       : select count(*), sum(id) from holo_query_id_demo;
query_id  : 1002002606817139331
rows      : [(1000, 500500)]
notices   : ['One or more columns in the following table(s) do not have statistics: holo_query_id_demo', 'QueryID: 1002002606817139331']

Pools de connexions

Étant donné que le paramètre s'applique à une seule session, chaque connexion physique doit l'utiliser. Avec un pool de connexions, définissez-le dans l'étape d'initialisation de la connexion plutôt qu'avant chaque requête.

L'exemple suivant utilise psycopg_pool pour Python :

# Run pip install psycopg_pool first.
from psycopg_pool import ConnectionPool

def configure(conn):
    conn.autocommit = True
    conn.add_notice_handler(notice_handler)
    conn.execute("set hg_experimental_display_query_id = on;")

pool = ConnectionPool(kwargs=CONN_INFO, configure=configure, min_size=1, max_size=4)

with pool.connection() as conn:
    conn.execute("select 1;").fetchall()

Pour Java, utilisez le SQL d'initialisation de votre pool afin que chaque connexion physique ait le paramètre activé. Les exemples suivants utilisent HikariCP et Druid :

// HikariCP: connectionInitSql runs when each physical connection is established.
HikariConfig config = new HikariConfig();
config.setJdbcUrl(url);
config.setUsername(user);
config.setPassword(password);
config.setConnectionInitSql("set hg_experimental_display_query_id = on;");
HikariDataSource dataSource = new HikariDataSource(config);

// Druid: connectionInitSqls accepts multiple initialization statements.
DruidDataSource druid = new DruidDataSource();
druid.setUrl(url);
druid.setUsername(user);
druid.setPassword(password);
druid.setConnectionInitSqls(Collections.singletonList("set hg_experimental_display_query_id = on;"));

Après avoir emprunté une connexion au pool, vous récupérez toujours l'ID de requête avec statement.getWarnings() après chaque instruction. Pour plus d'informations, consultez la section Java (JDBC).

Rechercher les détails d'exécution par ID de requête

Avec l'ID de requête, vous pouvez identifier précisément la durée, le statut, le nombre de lignes lues et d'autres détails d'une requête dans le journal des requêtes lentes :

select query_id, status, duration, query_start, application_name, command_tag
from hologres.hg_query_log
where query_id = '<QUERY_ID>';

L'écriture dans hologres.hg_query_log présente un décalage d'environ une minute. Une requête qui vient de se terminer peut ne pas encore apparaître ; réessayez donc après une courte attente.

Remarques d'utilisation

  • Le paramètre s'applique à une seule session et est ignoré lorsque la connexion est fermée. Exécutez set hg_experimental_display_query_id = on; sur chaque nouvelle connexion, sinon les requêtes sur cette connexion ne renverront aucun ID de requête.

  • Toutes les instructions ne renvoient pas un ID de requête. Les instructions DDL telles que CREATE TABLE et DROP TABLE, ainsi que les requêtes simples qui n'atteignent pas le moteur de calcul comme select 1;, ne renvoient aucun ID de requête. Ceci est normal. Les instructions DML telles que INSERT et les requêtes régulières telles que SELECT en renvoient un.

  • Une chaîne NOTICE peut contenir d'autres messages, tels qu'un avertissement indiquant l'absence de statistiques. Recherchez le préfixe QueryID: afin de ne pas récupérer une valeur incorrecte.

Dépanner un ID de requête manquant

Vérifiez les points suivants dans l'ordre :

  1. Exécutez SHOW hg_experimental_display_query_id; pour confirmer que la valeur est on. Si elle est off, la connexion actuelle n'a jamais exécuté l'instruction — avec un pool de connexions, il se peut que vous ayez reçu une connexion différente. Définissez-le à nouveau ou examinez votre logique d'initialisation de connexion.

  2. Vérifiez si un message NOTICE est arrivé. Si aucun message n'est arrivé, le serveur n'a rien envoyé. Confirmez que la version de votre instance prend en charge le paramètre et que le type d'instruction produit un ID de requête.

  3. Si des messages NOTICE sont arrivés mais qu'aucun ID de requête n'a été analysé, le libellé ne correspond pas à votre règle d'analyse. Imprimez le message brut et ajustez la règle au format renvoyé par votre instance.

  4. Avec un pool de connexions, confirmez que l'instruction s'exécute dans l'étape d'initialisation de la connexion afin que chaque connexion physique l'applique.