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 |
|
|
Active ou désactive auto-analyze. |
|
Session / Database |
|
|
Intervalle auquel Hologres vérifie les modifications dans les tables internes et déclenche auto-analyze. |
|
Session / Database |
|
|
Intervalle auquel Hologres vérifie les modifications dans les tables externes et déclenche auto-analyze. |
|
Session / Database |
|
|
Nombre maximal de lignes échantillonnées par exécution d'auto-analyze. |
|
Session / Database |
|
|
Délai maximal avant qu'auto-analyze ne prenne en compte les modifications effectuées via les API fixes. |
|
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 |
|
|
Nombre maximal de partitions atteintes par requête. Une valeur de |
|
|
Session / Database |
|
|
Nombre de lignes récupérées par lot lors de l'analyse d'une table MaxCompute. |
|
— |
Session / Database |
|
|
Taille du fractionnement des données (en Mo) pour les lectures parallèles. Évitez de définir une valeur excessivement élevée. |
|
— |
Session / Database |
|
|
Degré maximal de parallélisme (DOP) pour l'exécution des requêtes. |
Nombre de cœurs CPU (max |
— |
Session / Database |
|
|
DOP maximal pour les opérations DML sur les tables externes. |
|
— |
Session / Database |
|
|
Permet la lecture des fichiers ORC MaxCompute via le lecteur natif Hologres. |
|
— |
Session / Database |
Cache de résultats
|
Parameter |
Description |
Default |
Level |
|
|
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. |
|
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 |
|
|
Contrôle la manière dont l'optimiseur recherche l'ordre de jointure optimal. Définissez la valeur sur |
|
Session |
|
|
Force l'agrégation en plusieurs étapes. Activez cette option pour les requêtes avec une cardinalité élevée dans la clause |
|
Session |
Sécurité et chiffrement
|
Parameter |
Description |
Default |
Level |
|
|
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. |
|
Database (recommandé) |
|
|
Active et configure le chiffrement des données au repos. Configurez ce paramètre au niveau de la base de données. |
|
Database (recommandé) |
Délais d'expiration des requêtes et des connexions
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 |
|
|
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 ; |
|
Session (recommandé) |
|
|
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 ; |
|
Database (recommandé) |
|
|
Libère les connexions inactives depuis plus longtemps que la durée spécifiée. La valeur est exprimée en millisecondes ; |
|
Database (recommandé) |
Conversion de type de données
|
Parameter |
Description |
Default |
Level |
|
|
Bascule la fonction de conversion spécifiée ( |
— |
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 |
|
|
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. |
|
|
Session / Database |
Fuseau horaire
|
Parameter |
Description |
Default |
Level |
|
|
Définit le fuseau horaire pour la session ou la base de données. |
|
Session / Database |
Opérations sur les tables
|
Parameter |
Description |
Default |
Level |
|
|
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é. |
|
Session / Database |
|
|
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. |
|
Session / Database |
|
|
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. |
|
Session / Database |
Réplication et surveillance
|
Parameter |
Description |
Default |
Level |
|
|
Active la réplication au niveau des shards. |
|
Session / Database |
|
|
Affiche l'ID de requête via un message NOTICE sur le client, ce qui vous permet de localiser une requête dans |
|
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 |
|
|
Effect |
Affiche l'ID de requête sur le client dans un message NOTICE lors de l'exécution d'une instruction. |
|
Default value |
|
|
Valid values |
|
|
Level |
Session ou database. |
|
Return format |
Un message NOTICE au format |
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 :
PreparedStatementfonctionne de la même manière. Appelezpstmt.getWarnings()après l'exécution de l'instruction.Appelez
clearWarnings()avant chaque instruction. Sinon, les avertissements s'accumulent sur le même objetStatementet 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 TABLEetDROP TABLE, ainsi que les requêtes simples qui n'atteignent pas le moteur de calcul commeselect 1;, ne renvoient aucun ID de requête. Ceci est normal. Les instructions DML telles queINSERTet les requêtes régulières telles queSELECTen 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 :
Exécutez
SHOW hg_experimental_display_query_id;pour confirmer que la valeur eston. Si elle estoff, 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.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.
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.
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.