SELECT et INSERT sur des données stockées sur un serveur PostgreSQL distant.
À l’heure actuelle, seules les versions 12 et ultérieures de PostgreSQL sont prises en charge par ce moteur de table.
Création d’une table
- Les noms de colonnes doivent être les mêmes que dans la table PostgreSQL d’origine, mais vous pouvez n’utiliser qu’une partie de ces colonnes, dans n’importe quel ordre.
- Les types de colonnes peuvent différer de ceux de la table PostgreSQL d’origine. ClickHouse essaie de convertir les valeurs vers les types de données ClickHouse.
- Le paramètre external_table_functions_use_nulls définit la manière de gérer les colonnes Nullable. Valeur par défaut : 1. Si la valeur est 0, la fonction de table ne crée pas de colonnes Nullable et insère des valeurs par défaut à la place des valeurs NULL. Cela s’applique également aux valeurs NULL dans les tableaux.
host:port— Adresse du serveur PostgreSQL.database— Nom de la base de données distante.table— Nom de la table distante, ou une requête transmise telle quelle à PostgreSQL (voir Utilisation d’une requête à la place d’un nom de table).user— Utilisateur PostgreSQL.password— Mot de passe de l’utilisateur.schema— Schéma de table autre que le schéma par défaut. Facultatif.on_conflict— Stratégie de résolution des conflits. Exemple :ON CONFLICT DO NOTHING. Facultatif. Remarque : l’ajout de cette option réduit l’efficacité de l’insertion.
Paramètres
PostgreSQL (ainsi que par la fonction de table postgresql) peut être configuré pour chaque table au moyen d’une clause SETTINGS. Si un paramètre n’est pas indiqué, la valeur du paramètre postgresql_* correspondant au niveau de la requête est utilisée par défaut.
postgresql_connection_pool_size
16.
postgresql_connection_pool_wait_timeout
0 signifie que l’opération bloque lorsque le pool est vide.
Valeur par défaut : 5000.
postgresql_connection_pool_retries
2.
postgresql_connection_pool_auto_close_connection
false.
postgresql_connection_attempt_timeout
connect_timeout dans l’URL de connexion.
Valeur par défaut : 2.
Exemple :
Détails d’implémentation
SELECT côté PostgreSQL s’exécutent sous la forme COPY (SELECT ...) TO STDOUT dans une transaction PostgreSQL en lecture seule, avec validation après chaque requête SELECT.
Les clauses WHERE simples telles que =, !=, >, >=, <, <= et IN sont exécutées sur le serveur PostgreSQL.
Toutes les jointures, agrégations, opérations de tri, conditions IN [ array ] et la contrainte d’échantillonnage LIMIT sont exécutées dans ClickHouse uniquement une fois la requête vers PostgreSQL terminée.
Passer une requête au lieu d’un nom de table
table peut être une requête SELECT transmise telle quelle à PostgreSQL. La structure de la table est déduite du résultat de la requête. La requête peut être écrite soit sous forme de sous-requête, soit encapsulée dans la fonction query :
INSERT n’y sont pas autorisées. La même syntaxe est prise en charge par la fonction de table postgresql.
La forme de sous-requête
(SELECT ...) est analysée par ClickHouse puis re-sérialisée dans le dialecte PostgreSQL (guillemets d’identifiants PostgreSQL et échappement des littéraux de chaîne) avant d’être envoyée au serveur. Elle doit donc être valide en SQL ClickHouse. Pour transmettre une syntaxe spécifique à PostgreSQL que ClickHouse n’analyse pas, utilisez la forme query('...'), dont le texte est envoyé à PostgreSQL tel quel.Toute clause externe WHERE, LIMIT, agrégation, etc. de la requête ClickHouse englobante n’est pas déportée dans la requête transmise — elle est appliquée dans ClickHouse après récupération du résultat complet de la requête. Pour limiter les données lues depuis PostgreSQL, placez le filtre dans la requête transmise. Avec external_table_strict_query = 1, un filtre externe qui ne peut pas être déporté est rejeté avec une exception au lieu d’être appliqué localement.INSERT côté PostgreSQL s’exécutent sous la forme COPY "table_name" (field1, field2, ... fieldN) FROM STDIN dans une transaction PostgreSQL, avec validation automatique après chaque instruction INSERT.
Les types PostgreSQL Array sont convertis en tableaux ClickHouse.
Attention : dans PostgreSQL, une donnée de type tableau, créée sous la forme
type_name[], peut contenir des tableaux multidimensionnels ayant un nombre de dimensions différent selon les lignes d’une même colonne. En revanche, dans ClickHouse, seuls les tableaux multidimensionnels ayant le même nombre de dimensions dans toutes les lignes d’une même colonne sont autorisés.|. Par exemple :
0.
Dans l’exemple ci-dessous, la réplique example01-1 a la priorité la plus élevée :