Limitations DDL et autres informations relatives à la base de données Aurora PostgreSQL Limitless - Amazon Aurora

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Limitations DDL et autres informations relatives à la base de données Aurora PostgreSQL Limitless

Les rubriques suivantes décrivent les limites ou fournissent des informations supplémentaires sur les commandes DDL SQL dans la base de données Aurora PostgreSQL Limitless.

ALTER TABLE

La ALTER TABLE commande est généralement prise en charge dans la base de données Aurora PostgreSQL Limitless. Pour plus d'informations, consultez ALTER TABLE dans la documentation de PostgreSQL.

Limites

ALTER TABLEprésente les limites suivantes pour les options prises en charge.

Supprimer une colonne
  • Sur les tableaux fragmentés, vous ne pouvez pas supprimer les colonnes qui font partie de la clé de partition.

  • Dans les tables de référence, vous ne pouvez pas supprimer les colonnes de clé primaire.

Modification du type de données d'une colonne
  • L'USINGexpression n'est pas prise en charge.

  • Sur les tableaux fragmentés, vous ne pouvez pas modifier le type des colonnes qui font partie de la clé de partition.

Ajouter ou supprimer une contrainte

Pour plus de détails sur ce qui n'est pas pris en charge, consultezConstraints.

Modification de la valeur par défaut d'une colonne

Les valeurs par défaut sont prises en charge. Pour de plus amples informations, veuillez consulter Valeurs par défaut.

Options non prises en charge

Certaines options ne sont pas prises en charge car elles dépendent de fonctionnalités non prises en charge, telles que les déclencheurs.

Les options suivantes au niveau du tableau pour ALTER TABLE ne sont pas prises en charge :

  • ALL IN TABLESPACE

  • ATTACH PARTITION

  • DETACH PARTITION

  • ONLYdrapeau

  • RENAME CONSTRAINT

Les options suivantes au niveau des colonnes pour ALTER TABLE ne sont pas prises en charge :

  • AJOUTER GÉNÉRÉ

  • SUPPRIMER L'EXPRESSION [SI ELLE EXISTE]

  • SUPPRIMER L'IDENTITÉ [SI ELLE EXISTE]

  • RESET

  • RESTART

  • SET

  • DÉFINIR LA COMPRESSION

  • SET STATISTICS

CREATE DATABASE

Dans Aurora PostgreSQL Limitless Database, seules les bases de données illimitées sont prises en charge.

En cours CREATE DATABASE d'exécution, les bases de données créées avec succès sur un ou plusieurs nœuds peuvent échouer sur d'autres nœuds, car la création de base de données est une opération non transactionnelle. Dans ce cas, les objets de base de données créés avec succès sont automatiquement supprimés de tous les nœuds dans un délai prédéterminé afin de maintenir la cohérence du groupe de partitions de base de données. Pendant ce temps, la recréation d'une base de données portant le même nom peut générer une erreur indiquant que la base de données existe déjà.

Les options suivantes sont prises en charge :

  • Colloque :

    CREATE DATABASE name WITH [LOCALE = locale] [LC_COLLATE = lc_collate] [LC_CTYPE = lc_ctype] [ICU_LOCALE = icu_locale] [ICU_RULES = icu_rules] [LOCALE_PROVIDER = locale_provider] [COLLATION_VERSION = collation_version];
  • CREATE DATABASE WITH OWNER:

    CREATE DATABASE name WITH OWNER = user_name;

Les options suivantes ne sont pas prises en charge :

  • CREATE DATABASE WITH TABLESPACE:

    CREATE DATABASE name WITH TABLESPACE = tablespace_name;
  • CREATE DATABASE WITH TEMPLATE:

    CREATE DATABASE name WITH TEMPLATE = template;

CREATE INDEX

CREATE INDEX CONCURRENTLYest pris en charge pour les tables fragmentées :

CREATE INDEX CONCURRENTLY index_name ON table_name(column_name);

CREATE UNIQUE INDEXest pris en charge pour tous les types de tables :

CREATE UNIQUE INDEX index_name ON table_name(column_name);

CREATE UNIQUE INDEX CONCURRENTLYn'est pas pris en charge :

CREATE UNIQUE INDEX CONCURRENTLY index_name ON table_name(column_name);

Pour plus d'informations, consultez UNIQUE. Pour des informations générales sur la création d'index, consultez CREATE INDEX dans la documentation de PostgreSQL.

Afficher les index

Les index ne sont pas tous visibles sur les routeurs lorsque vous utilisez \d table_name des commandes similaires. Utilisez plutôt la pg_catalog.pg_indexes vue pour obtenir des index, comme indiqué dans l'exemple suivant.

SET rds_aurora.limitless_create_table_mode='sharded'; SET rds_aurora.limitless_create_table_shard_key='{"id"}'; CREATE TABLE items (id int PRIMARY KEY, val int); CREATE INDEX items_my_index on items (id, val); postgres_limitless=> SELECT * FROM pg_catalog.pg_indexes WHERE tablename='items'; schemaname | tablename | indexname | tablespace | indexdef ------------+-----------+----------------+------------+------------------------------------------------------------------------ public | items | items_my_index | | CREATE INDEX items_my_index ON ONLY public.items USING btree (id, val) public | items | items_pkey | | CREATE UNIQUE INDEX items_pkey ON ONLY public.items USING btree (id) (2 rows)

CREATE SCHEMA

CREATE SCHEMAavec un élément de schéma n'est pas pris en charge :

CREATE SCHEMA my_schema CREATE TABLE (column_name INT);

Cela génère une erreur similaire à la suivante :

ERROR: CREATE SCHEMA with schema elements is not supported

CREATE TABLE

Les relations dans CREATE TABLE les instructions ne sont pas prises en charge, par exemple :

CREATE TABLE orders (orderid int, customerId int, orderDate date) WITH (autovacuum_enabled = false);

IDENTITYles colonnes ne sont pas prises en charge, par exemple :

CREATE TABLE orders (orderid INT GENERATED ALWAYS AS IDENTITY);

La base de données Aurora PostgreSQL Limitless prend en charge jusqu'à 54 caractères pour les noms de table fragmentés.

CREATE TABLE AS

Pour créer une table en utilisantCREATE TABLE AS, vous devez utiliser la rds_aurora.limitless_create_table_mode variable. Pour les tableaux fragmentés, vous devez également utiliser la rds_aurora.limitless_create_table_shard_key variable. Pour de plus amples informations, veuillez consulter Création de tables illimitées à l'aide de variables.

-- Set the variables. SET rds_aurora.limitless_create_table_mode='sharded'; SET rds_aurora.limitless_create_table_shard_key='{"a"}'; CREATE TABLE ctas_table AS SELECT 1 a; -- "source" is the source table whose columns and data types are used to create the new "ctas_table2" table. CREATE TABLE ctas_table2 AS SELECT a,b FROM source;

Vous ne pouvez pas les utiliser CREATE TABLE AS pour créer des tables de référence, car elles nécessitent des contraintes de clé primaire. CREATE TABLE ASne propage pas les clés primaires vers les nouvelles tables.

Pour des informations générales, consultez CREATE TABLE AS dans la documentation de PostgreSQL.

DROP DATABASE

Vous pouvez supprimer les bases de données que vous avez créées.

La DROP DATABASE commande s'exécute de manière asynchrone en arrière-plan. Pendant son exécution, vous recevrez un message d'erreur si vous essayez de créer une nouvelle base de données portant le même nom.

SELECT INTO

SELECT INTOest fonctionnellement similaire à. CREATE TABLE AS Vous devez utiliser la rds_aurora.limitless_create_table_mode variable. Pour les tableaux fragmentés, vous devez également utiliser la rds_aurora.limitless_create_table_shard_key variable. Pour de plus amples informations, veuillez consulter Création de tables illimitées à l'aide de variables.

-- Set the variables. SET rds_aurora.limitless_create_table_mode='sharded'; SET rds_aurora.limitless_create_table_shard_key='{"a"}'; -- "source" is the source table whose columns and data types are used to create the new "destination" table. SELECT * INTO destination FROM source;

Actuellement, l'SELECT INTOopération est effectuée via le routeur, et non directement via les partitions. Par conséquent, les performances peuvent être lentes.

Pour des informations générales, consultez SELECT INTO dans la documentation de PostgreSQL.

Constraints

Les limitations suivantes s'appliquent aux contraintes de la base de données Aurora PostgreSQL Limitless.

CHECK

Les contraintes simples impliquant des opérateurs de comparaison avec des littéraux sont prises en charge. Les expressions et contraintes plus complexes qui nécessitent des validations de fonctions ne sont pas prises en charge, comme le montrent les exemples suivants.

CREATE TABLE my_table ( id INT CHECK (id > 0) -- supported , val INT CHECK (val > 0 AND val < 1000) -- supported , tag TEXT CHECK (length(tag) > 0) -- not supported: throws "Expression inside CHECK constraint is not supported" , op_date TIMESTAMP WITH TIME ZONE CHECK (op_date <= now()) -- not supported: throws "Expression inside CHECK constraint is not supported" );

Vous pouvez attribuer des noms explicites aux contraintes, comme illustré dans l'exemple suivant.

CREATE TABLE my_table ( id INT CONSTRAINT positive_id CHECK (id > 0) , val INT CONSTRAINT val_in_range CHECK (val > 0 AND val < 1000) );

Vous pouvez utiliser la syntaxe de contrainte au niveau de la table avec la CHECK contrainte, comme illustré dans l'exemple suivant.

CREATE TABLE my_table ( id INT CONSTRAINT positive_id CHECK (id > 0) , min_val INT CONSTRAINT min_val_in_range CHECK (min_val > 0 AND min_val < 1000) , max_val INT , CONSTRAINT max_val_in_range CHECK (max_val > 0 AND max_val < 1000 AND max_val > min_val) );
EXCLUDE

Les contraintes d'exclusion ne sont pas prises en charge dans la base de données Aurora PostgreSQL Limitless.

FOREIGN KEY

Pour de plus amples informations, veuillez consulter Clés étrangères.

NON NUL

NOT NULLles contraintes sont prises en charge sans aucune restriction.

PRIMARY KEY

La clé primaire implique des contraintes uniques et, par conséquent, les mêmes restrictions sur les contraintes uniques s'appliquent à la clé primaire. Cela signifie :

  • Si une table est convertie en table fragmentée, la clé de partition doit être un sous-ensemble de la clé primaire. C'est-à-dire que la clé primaire contient toutes les colonnes de la clé de partition.

  • Si une table est convertie en table de référence, elle doit comporter une clé primaire.

Les exemples suivants illustrent l'utilisation des clés primaires.

-- Create a standard table. CREATE TABLE public.my_table ( item_id INT , location_code INT , val INT , comment text ); -- Change the table to a sharded table using the 'item_id' and 'location_code' columns as shard keys. CALL rds_aurora.limitless_alter_table_type_sharded('public.my_table', ARRAY['item_id', 'location_code']);

Essayer d'ajouter une clé primaire qui ne contient pas de clé de partition :

-- Add column 'item_id' as the primary key. -- Invalid because the primary key doesnt include all columns from the shard key: -- 'location_code' is part of the shard key but not part of the primary key ALTER TABLE public.my_table ADD PRIMARY KEY (item_id); -- ERROR -- add column "val" as primary key -- Invalid because primary key does not include all columns from shard key: -- item_id and location_code iare part of shard key but not part of the primary key ALTER TABLE public.my_table ADD PRIMARY KEY (item_id); -- ERROR

Essayer d'ajouter une clé primaire contenant une clé de partition :

-- Add the 'item_id' and 'location_code' columns as the primary key. -- Valid because the primary key contains the shard key. ALTER TABLE public.my_table ADD PRIMARY KEY (item_id, location_code); -- OK -- Add the 'item_id', 'location_code', and 'val' columns as the primary key. -- Valid because the primary key contains the shard key. ALTER TABLE public.my_table ADD PRIMARY KEY (item_id, location_code, val); -- OK

Remplacez un tableau standard par un tableau de référence.

-- Create a standard table. CREATE TABLE zipcodes (zipcode INT PRIMARY KEY, details VARCHAR); -- Convert the table to a reference table. CALL rds_aurora.limitless_alter_table_type_reference('public.zipcode');

Pour plus d'informations sur la création de tables fragmentées et de tables de référence, consultezCréation de tables de base de données Aurora Postgre SQL Limitless.

UNIQUE

Dans les tables fragmentées, la clé unique doit contenir la clé de partition, c'est-à-dire que la clé de partition doit être un sous-ensemble de la clé unique. Ceci est vérifié lorsque vous remplacez le type de tableau par découpé. Dans les tableaux de référence, il n'y a aucune restriction.

CREATE TABLE customer ( customer_id INT NOT NULL , zipcode INT , email TEXT UNIQUE );

Les UNIQUE contraintes au niveau des tables sont prises en charge, comme indiqué dans l'exemple suivant.

CREATE TABLE customer ( customer_id INT NOT NULL , zipcode INT , email TEXT , CONSTRAINT zipcode_and_email UNIQUE (zipcode, email) );

L'exemple suivant montre l'utilisation conjointe d'une clé primaire et d'une clé unique. Les deux clés doivent inclure la clé shard.

SET rds_aurora.limitless_create_table_mode='sharded'; SET rds_aurora.limitless_create_table_shard_key='{"p_id"}'; CREATE TABLE t1 ( p_id BIGINT NOT NULL, c_id BIGINT NOT NULL, PRIMARY KEY (p_id), UNIQUE (p_id, c_id) );

Pour plus d'informations, consultez la section Contraintes dans la documentation de PostgreSQL.

Valeurs par défaut

La base de données Aurora PostgreSQL Limitless prend en charge les expressions dans les valeurs par défaut.

L'exemple suivant montre l'utilisation des valeurs par défaut.

CREATE TABLE t ( a INT DEFAULT 5, b TEXT DEFAULT 'NAN', c NUMERIC ); CALL rds_aurora.limitless_alter_table_type_sharded('t', ARRAY['a']); INSERT INTO t DEFAULT VALUES; SELECT * FROM t; a | b | c ---+-----+--- 5 | NAN | (1 row)

Les expressions sont prises en charge, comme indiqué dans l'exemple suivant.

CREATE TABLE t1 (a NUMERIC DEFAULT random());

L'exemple suivant ajoute une nouvelle colonne qui est NOT NULL et possède une valeur par défaut.

ALTER TABLE t ADD COLUMN d BOOLEAN NOT NULL DEFAULT FALSE; SELECT * FROM t; a | b | c | d ---+-----+---+--- 5 | NAN | | f (1 row)

L'exemple suivant modifie une colonne existante avec une valeur par défaut.

ALTER TABLE t ALTER COLUMN c SET DEFAULT 0.0; INSERT INTO t DEFAULT VALUES; SELECT * FROM t; a | b | c | d ---+-----+-----+----- 5 | NAN | | f 5 | NAN | 0.0 | f (2 rows)

L'exemple suivant supprime une valeur par défaut.

ALTER TABLE t ALTER COLUMN a DROP DEFAULT; INSERT INTO t DEFAULT VALUES; SELECT * FROM t; a | b | c | d ---+-----+-----+----- 5 | NAN | | f 5 | NAN | 0.0 | f | NAN | 0.0 | f (3 rows)

Pour plus d'informations, consultez la section Valeurs par défaut dans la documentation de PostgreSQL.

Extensions

Les extensions PostgreSQL suivantes sont prises en charge dans la base de données Aurora PostgreSQL Limitless :

La plupart des extensions PostgreSQL ne sont actuellement pas prises en charge dans la base de données Aurora PostgreSQL Limitless. Toutefois, vous pouvez toujours utiliser le paramètre de configuration shared_preload_libraries (SPL) pour charger des extensions dans le cluster de base de données principal Aurora PostgreSQL. Ils sont également chargés dans la base de données Aurora PostgreSQL Limitless, mais ils risquent de ne pas fonctionner correctement.

Par exemple, vous pouvez charger l'pg_hint_planextension, mais le fait de la charger ne garantit pas que les indications transmises dans les commentaires de requête seront utilisées.

Note

Vous ne pouvez pas modifier les objets associés à l'extension pg_stat_statements. Pour plus d'informations sur l'installationpg_stat_statements, consultez limitless_stat_statements.

Vous pouvez utiliser les pg_available_extension_versions fonctions pg_available_extensions et pour rechercher les extensions prises en charge dans la base de données Aurora PostgreSQL Limitless.

Les extensions suivantes DDLs sont prises en charge :

CREATE EXTENSION

Vous pouvez créer des extensions, comme dans PostgreSQL.

CREATE EXTENSION [ IF NOT EXISTS ] extension_name [ WITH ] [ SCHEMA schema_name ] [ VERSION version ] [ CASCADE ]

Pour plus d'informations, consultez CREATE EXTENSION dans la documentation de PostgreSQL.

ALTER EXTENSION

Les éléments suivants DDLs sont pris en charge :

ALTER EXTENSION name UPDATE [ TO new_version ] ALTER EXTENSION name SET SCHEMA new_schema

Pour plus d'informations, consultez ALTER EXTENSION dans la documentation de PostgreSQL.

DROP EXTENSION

Vous pouvez supprimer des extensions, comme dans PostgreSQL.

DROP EXTENSION [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

Pour plus d'informations, consultez DROP EXTENSION dans la documentation de PostgreSQL.

Les extensions suivantes DDLs ne sont pas prises en charge :

ALTER EXTENSION

Vous ne pouvez pas ajouter ou supprimer des objets membres dans les extensions.

ALTER EXTENSION name ADD member_object ALTER EXTENSION name DROP member_object

différences entre pg_buffercache dans la base de données Aurora PostgreSQL Limitless

Dans la base de données Aurora PostgreSQL Limitless, lorsque vous installez l'extension pg_buffercache et que vous utilisez la vue, vous recevez des informations relatives à pg_buffercache la mémoire tampon uniquement en provenance du nœud auquel vous êtes actuellement connecté : le routeur. De même, l'utilisation de la fonction pg_buffercache_summary ou pg_buffercache_usage_counts fournit des informations uniquement à partir du nœud connecté.

Vous pouvez avoir de nombreux nœuds et avoir besoin d'accéder aux informations de la mémoire tampon à partir de n'importe quel nœud pour diagnostiquer efficacement les problèmes. Par conséquent, Limitless Database fournit les fonctions suivantes :

  • rds_aurora.limitless_pg_buffercache(subcluster_id)

  • rds_aurora.limitless_pg_buffercache_summary(subcluster_id)

  • rds_aurora.limitless_pg_buffercache_usage_counts(subcluster_id)

En saisissant l'ID de sous-cluster de n'importe quel nœud, qu'il s'agisse d'un routeur ou d'une partition, vous pouvez facilement accéder aux informations de mémoire tampon spécifiques à ce nœud. Ces fonctions sont directement disponibles lorsque vous installez l'pg_buffercacheextension dans la base de données illimitée.

Note

La base de données Aurora PostgreSQL Limitless prend en charge ces fonctions pour les versions 1.4 et supérieures de l'extension. pg_buffercache

Les colonnes affichées dans la limitless_pg_buffercache vue sont légèrement différentes de celles de la pg_buffercache vue :

  • bufferid— Reste inchangé par rapport àpg_buffercache.

  • relname— Au lieu d'afficher le numéro de nœud du fichier tel qu'il est pg_buffercache indiqué, limitless_pg_buffercache présente le nœud associé relname s'il est disponible dans la base de données actuelle ou dans les catalogues de systèmes partagés, sinonNULL.

  • parent_relname— Cette nouvelle colonne, absente danspg_buffercache, affiche le parent relname si la valeur de la relname colonne représente une table partitionnée (dans le cas de tables fragmentées). Dans le cas contraire, il s'afficheNULL.

  • spcname— Au lieu d'afficher l'identifiant d'objet de l'espace disque logique (OID) comme dans le cas présentpg_buffercache, limitless_pg_buffercache affiche le nom de l'espace disque logique.

  • datname— Au lieu d'afficher l'OID de la base de données tel quelpg_buffercache, limitless_pg_buffercache affiche le nom de la base de données.

  • relforknumber— Reste inchangé par rapport àpg_buffercache.

  • relblocknumber— Reste inchangé par rapport àpg_buffercache.

  • isdirty— Reste inchangé par rapport àpg_buffercache.

  • usagecount— Reste inchangé par rapport àpg_buffercache.

  • pinning_backends— Reste inchangé par rapport àpg_buffercache.

Les colonnes limitless_pg_buffercache_summary et les limitless_pg_buffercache_usage_counts vues sont les mêmes que celles des vues normales pg_buffercache_summary et des pg_buffercache_usage_counts vues, respectivement.

En utilisant ces fonctions, vous pouvez accéder à des informations détaillées sur le cache tampon sur tous les nœuds de votre environnement de base de données Limitless, ce qui permet un diagnostic et une gestion plus efficaces de vos systèmes de base de données.

différences entre pgstattuple dans la base de données Aurora PostgreSQL Limitless

Dans Aurora PostgreSQL, l'extension pgstattuple ne prend actuellement pas en charge les tables étrangères, les tables partitionnées ou les index partitionnés. Toutefois, dans la base de données Aurora PostgreSQL Limitless, les objets créés par les utilisateurs font souvent partie de ces types non pris en charge. Bien qu'il existe des tables et des index réguliers (par exemple, les tables de catalogue et leurs index), la plupart des objets résident sur des nœuds étrangers, ce qui en fait des objets étrangers pour le routeur.

Nous reconnaissons l'importance de cette extension pour obtenir des statistiques au niveau des tuples, ce qui est crucial pour des tâches telles que l'élimination des ballonnements et la collecte d'informations diagnostiques. Par conséquent, la base de données Aurora PostgreSQL Limitless prend en charge l'extension dans des bases de pgstattuple données illimitées.

La base de données Aurora PostgreSQL Limitless inclut les fonctions suivantes dans le schéma : rds_aurora

Fonctions statistiques au niveau du tuple

rds_aurora.limitless_pgstattuple(relation_name)

  • Objectif : Extraire des statistiques au niveau des tuples pour les tables standard et leurs index

  • Entrée : relation_name (texte) — Le nom de la relation

  • Résultat : colonnes cohérentes avec celles renvoyées par la pgstattuple fonction dans Aurora PostgreSQL

rds_aurora.limitless_pgstattuple(relation_name, subcluster_id)

  • Objectif : Extraire des statistiques au niveau du tuple pour les tables de référence, les tables partitionnées, les tables de catalogue et leurs index

  • Entrée :

    • relation_name(texte) — Le nom de la relation

    • subcluster_id(text) — L'ID du sous-cluster du nœud où les statistiques doivent être extraites

  • Sortie :

    • Pour les tables de référence et de catalogue (y compris leurs index), les colonnes sont cohérentes avec celles d'Aurora PostgreSQL.

    • Pour les tables fragmentées, les statistiques représentent uniquement la partition de la table fragmentée résidant sur le sous-cluster spécifié.

Fonctions de statistiques d'index

rds_aurora.limitless_pgstatindex(relation_name)

  • Objectif : Extraire des statistiques pour les index B-tree sur des tables standard

  • Entrée : relation_name (texte) — Le nom de l'index B-tree

  • Résultat : Toutes les colonnes sauf root_block_no sont renvoyées. Les colonnes renvoyées sont cohérentes avec la pgstatindex fonction d'Aurora PostgreSQL.

rds_aurora.limitless_pgstatindex(relation_name, subcluster_id)

  • Objectif : Extraire des statistiques pour les index B-tree des tables de référence, des tables partitionnées et des tables de catalogue.

  • Entrée :

    • relation_name(texte) — Le nom de l'index B-tree

    • subcluster_id(text) — L'ID du sous-cluster du nœud où les statistiques doivent être extraites

  • Sortie :

    • Pour les index des tables de référence et de catalogue, toutes les colonnes (saufroot_block_no) sont renvoyées. Les colonnes renvoyées sont cohérentes avec Aurora PostgreSQL.

    • Pour les tables fragmentées, les statistiques représentent uniquement la partition de l'index de table fragmenté résidant sur le sous-cluster spécifié. La tree_level colonne indique la moyenne de toutes les tranches de table du sous-cluster demandé.

rds_aurora.limitless_pgstatginindex(relation_name)

  • Objectif : Extraire les statistiques pour les indices inversés généralisés (GINs) sur des tables standard

  • Saisie : relation_name (texte) — Le nom du GIN

  • Résultat : colonnes cohérentes avec celles renvoyées par la pgstatginindex fonction dans Aurora PostgreSQL

rds_aurora.limitless_pgstatginindex(relation_name, subcluster_id)

  • Objectif : Extraire des statistiques pour les index GIN sur les tables de référence, les tables partitionnées et les tables de catalogue.

  • Entrée :

    • relation_name(texte) — Le nom de l'index

    • subcluster_id(text) — L'ID du sous-cluster du nœud où les statistiques doivent être extraites

  • Sortie :

    • Pour les index GIN des tables de référence et de catalogue, les colonnes sont cohérentes avec celles d'Aurora PostgreSQL.

    • Pour les tables fragmentées, les statistiques représentent uniquement la partition de l'index de table fragmenté résidant sur le sous-cluster spécifié.

rds_aurora.limitless_pgstathashindex(relation_name)

  • Objectif : Extraire les statistiques pour les index de hachage sur les tables standard

  • Entrée : relation_name (texte) — Le nom de l'index de hachage

  • Résultat : colonnes cohérentes avec celles renvoyées par la pgstathashindex fonction dans Aurora PostgreSQL

rds_aurora.limitless_pgstathashindex(relation_name, subcluster_id)

  • Objectif : Extraire les statistiques relatives aux index de hachage des tables de référence, des tables partitionnées et des tables de catalogue.

  • Entrée :

    • relation_name(texte) — Le nom de l'index

    • subcluster_id(text) — L'ID du sous-cluster du nœud où les statistiques doivent être extraites

  • Sortie :

    • Pour les index de hachage des tables de référence et de catalogue, les colonnes sont cohérentes avec Aurora PostgreSQL.

    • Pour les tables fragmentées, les statistiques représentent uniquement la partition de l'index de table fragmenté résidant sur le sous-cluster spécifié.

Fonctions de comptage de pages

rds_aurora.limitless_pg_relpages(relation_name)

  • Objectif : Extraire le nombre de pages pour les tables standard et leurs index

  • Entrée : relation_name (texte) — Le nom de la relation

  • Sortie : nombre de pages de la relation spécifiée

rds_aurora.limitless_pg_relpages(relation_name, subcluster_id)

  • Objectif : Extraire le nombre de pages pour les tables de référence, les tables partitionnées et les tables de catalogue (y compris leurs index)

  • Entrée :

    • relation_name(texte) — Le nom de la relation

    • subcluster_id(texte) — L'ID du sous-cluster du nœud où le nombre de pages doit être extrait

  • Résultat : pour les tableaux fragmentés, le nombre de pages est la somme des pages de toutes les tranches de tableau du sous-cluster spécifié.

Fonctions statistiques approximatives au niveau du tuple

rds_aurora.limitless_pgstattuple_approx(relation_name)

  • Objectif : Extraire des statistiques approximatives au niveau du tuple pour les tables standard et leurs index

  • Entrée : relation_name (texte) — Le nom de la relation

  • Sortie : colonnes cohérentes avec celles renvoyées par la fonction pgstattuple_approx dans Aurora PostgreSQL

rds_aurora.limitless_pgstattuple_approx(relation_name, subcluster_id)

  • Objectif : Extraire des statistiques approximatives au niveau du tuple pour les tables de référence, les tables partitionnées et les tables de catalogue (y compris leurs index)

  • Entrée :

    • relation_name(texte) — Le nom de la relation

    • subcluster_id(text) — L'ID du sous-cluster du nœud où les statistiques doivent être extraites

  • Sortie :

    • Pour les tables de référence et de catalogue (y compris leurs index), les colonnes sont cohérentes avec celles d'Aurora PostgreSQL.

    • Pour les tables fragmentées, les statistiques représentent uniquement la partition de la table fragmentée résidant sur le sous-cluster spécifié.

Note

Actuellement, la base de données Aurora PostgreSQL Limitless ne prend pas en charge pgstattuple l'extension sur les vues matérialisées, les tables TOAST ou les tables temporaires.

Dans la base de données Aurora PostgreSQL Limitless, vous devez fournir l'entrée sous forme de texte, bien qu'Aurora PostgreSQL prenne en charge d'autres formats.

Clés étrangères

Les contraintes de clé étrangère (FOREIGN KEY) sont prises en charge avec certaines restrictions :

  • CREATE TABLEavec n'FOREIGN KEYest pris en charge que pour les tables standard. Pour créer un tableau fragmenté ou de référence avecFOREIGN KEY, créez d'abord le tableau sans contrainte de clé étrangère. Modifiez-le ensuite à l'aide de l'instruction suivante :

    ALTER TABLE ADD CONSTRAINT;
  • La conversion d'une table standard en table fragmentée ou en table de référence n'est pas prise en charge lorsque la table est soumise à une contrainte de clé étrangère. Supprimez la contrainte, puis ajoutez-la après la conversion.

  • Les limitations suivantes s'appliquent aux types de tables pour les contraintes de clé étrangère :

    • Une table standard peut avoir une contrainte de clé étrangère par rapport à une autre table standard.

    • Une table fragmentée peut être soumise à une contrainte de clé étrangère si les tables parent et enfant sont colocalisées et si la clé étrangère est un sur-ensemble de la clé de partition.

    • Une table fragmentée peut être soumise à une contrainte de clé étrangère par rapport à une table de référence.

    • Une table de référence peut avoir une contrainte de clé étrangère par rapport à une autre table de référence.

Options à clé étrangère

Les clés étrangères sont prises en charge dans la base de données Aurora PostgreSQL Limitless pour certaines options DDL. Le tableau suivant répertorie les options prises en charge et non prises en charge entre les tables de base de données Aurora PostgreSQL Limitless.

Option DDL Référence à la référence Découpé à fragmenté (colocalisé) Déchiqueté pour référence De norme en norme

DEFERRABLE

Oui Oui Oui Oui

INITIALLY DEFERRED

Oui Oui Oui Oui

INITIALLY IMMEDIATE

Oui Oui Oui Oui

MATCH FULL

Oui Oui Oui Oui

MATCH PARTIAL

Non Non Non Non

MATCH SIMPLE

Oui Oui Oui Oui

NOT DEFERRABLE

Oui Oui Oui Oui

NOT VALID

Oui Non Non Oui

ON DELETE CASCADE

Oui Oui Oui Oui

ON DELETE NO ACTION

Oui Oui Oui Oui

ON DELETE RESTRICT

Oui Oui Oui Oui

ON DELETE SET DEFAULT

Non Non Non Non

ON DELETE SET NULL

Oui Non Non Oui

ON UPDATE CASCADE

Non Non Non Oui

ON UPDATE NO ACTION

Oui Oui Oui Oui

ON UPDATE RESTRICT

Oui Oui Oui Oui

ON UPDATE SET DEFAULT

Non Non Non Non

ON UPDATE SET NULL

Oui Non Non Oui

Exemples

  • De norme en norme :

    set rds_aurora.limitless_create_table_mode='standard'; CREATE TABLE products( product_no integer PRIMARY KEY, name text, price numeric ); CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products (product_no), quantity integer ); SELECT constraint_name, table_name, constraint_type FROM information_schema.table_constraints WHERE constraint_type='FOREIGN KEY'; constraint_name | table_name | constraint_type -------------------------+-------------+----------------- orders_product_no_fkey | orders | FOREIGN KEY (1 row)
  • Découpé à fragmenté (colocalisé) :

    set rds_aurora.limitless_create_table_mode='sharded'; set rds_aurora.limitless_create_table_shard_key='{"product_no"}'; CREATE TABLE products( product_no integer PRIMARY KEY, name text, price numeric ); set rds_aurora.limitless_create_table_shard_key='{"order_id"}'; set rds_aurora.limitless_create_table_collocate_with='products'; CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer, quantity integer ); ALTER TABLE orders ADD CONSTRAINT order_product_fk FOREIGN KEY (product_no) REFERENCES products (product_no);
  • Déchiqueté pour référence :

    set rds_aurora.limitless_create_table_mode='reference'; CREATE TABLE products( product_no integer PRIMARY KEY, name text, price numeric ); set rds_aurora.limitless_create_table_mode='sharded'; set rds_aurora.limitless_create_table_shard_key='{"order_id"}'; CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer, quantity integer ); ALTER TABLE orders ADD CONSTRAINT order_product_fk FOREIGN KEY (product_no) REFERENCES products (product_no);
  • Référence à référence :

    set rds_aurora.limitless_create_table_mode='reference'; CREATE TABLE products( product_no integer PRIMARY KEY, name text, price numeric ); CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer, quantity integer ); ALTER TABLE orders ADD CONSTRAINT order_product_fk FOREIGN KEY (product_no) REFERENCES products (product_no);

Fonctions

Les fonctions sont prises en charge dans la base de données Aurora PostgreSQL Limitless.

Les fonctions suivantes DDLs sont prises en charge :

CREATE FUNCTION

Vous pouvez créer des fonctions, comme dans Aurora PostgreSQL, à l'exception de la modification de leur volatilité lors de leur remplacement.

Pour plus d'informations, consultez CREATE FUNCTION dans la documentation PostgreSQL.

ALTER FUNCTION

Vous pouvez modifier les fonctions, comme dans Aurora PostgreSQL, à l'exception de la modification de leur volatilité.

Pour plus d'informations, consultez ALTER FUNCTION dans la documentation de PostgreSQL.

DROP FUNCTION

Vous pouvez supprimer des fonctions, comme dans Aurora PostgreSQL.

DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...] [ CASCADE | RESTRICT ]

Pour plus d'informations, consultez DROP FUNCTION dans la documentation de PostgreSQL.

Répartition des fonctions

Lorsque toutes les instructions d'une fonction sont ciblées sur une seule partition, il est avantageux de transférer l'ensemble de la fonction vers la partition cible. Le résultat est ensuite retransmis au routeur, au lieu de démêler la fonction du routeur lui-même. La fonctionnalité de transfert des fonctions et des procédures stockées est utile pour les clients qui souhaitent exécuter leur fonction ou leur procédure stockée au plus près de la source de données, à savoir le shard.

Pour distribuer une fonction, créez d'abord la fonction, puis appelez la rds_aurora.limitless_distribute_function procédure de distribution. Cette fonction utilise la syntaxe suivante :

SELECT rds_aurora.limitless_distribute_function('function_prototype', ARRAY['shard_key'], 'collocating_table');

La fonction prend les paramètres suivants :

  • function_prototype— La fonction à distribuer. Ne mentionnez que les arguments d'entrée, et aucun des arguments de sortie.

    Si l'un des arguments est défini en tant que OUT paramètres, n'incluez pas son type dans les arguments defunction_prototype.

  • ARRAY['shard_key']— Liste des arguments de fonction identifiés comme étant la clé de partition de la fonction.

  • collocating_table— Le tableau fragmenté qui contient la plage de données sur la partition cible.

Pour identifier la partition sur laquelle exécuter cette fonction, le système prend l'ARRAY['shard_key']argument, le hache et trouve la partition collocating_table qui héberge la plage contenant cette valeur de hachage.

Restrictions

Lorsque vous distribuez une fonction ou une procédure, elle ne traite que les données délimitées par la plage de clés de cette partition. Dans les cas où la fonction ou la procédure essaie d'accéder aux données d'une autre partition, les résultats renvoyés par la fonction ou procédure distribuée seront différents de ceux renvoyés par une fonction ou procédure non distribuée.

Par exemple, vous créez une fonction contenant des requêtes qui toucheront plusieurs partitions, puis vous appelez la rds_aurora.limitless_distribute_function procédure pour la distribuer. Lorsque vous invoquez cette fonction en fournissant des arguments pour une clé de partition, il est probable que les résultats de son exécution seront limités par les valeurs présentes dans cette partition. Ces résultats sont différents de ceux produits sans distribution de la fonction.

Exemples

Considérons la fonction suivante func où nous avons le tableau fragmenté customers avec la clé de partition. customer_id

postgres_limitless=> CREATE OR REPLACE FUNCTION func(c_id integer, sc integer) RETURNS int language SQL volatile AS $$ UPDATE customers SET score = sc WHERE customer_id = c_id RETURNING score; $$;

Maintenant, nous distribuons cette fonction :

SELECT rds_aurora.limitless_distribute_function('func(integer, integer)', ARRAY['c_id'], 'customers');

Vous trouverez ci-dessous des exemples de plans de requêtes.

EXPLAIN(costs false, verbose true) SELECT func(27+1,10); QUERY PLAN -------------------------------------------------- Foreign Scan Output: (func((27 + 1), 10)) Remote SQL: SELECT func((27 + 1), 10) AS func Single Shard Optimized (4 rows)
EXPLAIN(costs false, verbose true) SELECT * FROM customers,func(customer_id, score) WHERE customer_id=10 AND score=27; QUERY PLAN --------------------------------------------------------------------- Foreign Scan Output: customer_id, name, score, func Remote SQL: SELECT customers.customer_id, customers.name, customers.score, func.func FROM public.customers, LATERAL func(customers.customer_id, customers.score) func(func) WHERE ((customers.customer_id = 10) AND (customers.score = 27)) Single Shard Optimized (10 rows)

L'exemple suivant montre une procédure avec des OUT paramètres IN et comme arguments.

CREATE OR REPLACE FUNCTION get_data(OUT id INTEGER, IN arg_id INT) AS $$ BEGIN SELECT customer_id, INTO id FROM customer WHERE customer_id = arg_id; END; $$ LANGUAGE plpgsql;

L'exemple suivant distribue la procédure en utilisant uniquement IN des paramètres.

EXPLAIN(costs false, verbose true) SELECT * FROM get_data(1); QUERY PLAN ----------------------------------- Foreign Scan Output: id Remote SQL: SELECT customer_id FROM get_data(1) get_data(id) Single Shard Optimized (6 rows)

Volatilité des fonctions

Vous pouvez déterminer si une fonction est immuable, stable ou volatile en vérifiant sa provolatile valeur dans la vue pg_proc. La provolatile valeur indique si le résultat de la fonction dépend uniquement de ses arguments d'entrée ou s'il est affecté par des facteurs extérieurs.

La valeur est l'une des suivantes :

  • i— Des fonctions immuables, qui fournissent toujours le même résultat pour les mêmes entrées

  • s— Fonctions stables, dont les résultats (pour les entrées fixes) ne changent pas au cours d'un scan

  • v— Fonctions volatiles, dont les résultats peuvent changer à tout moment. Utilisez-le également v pour les fonctions comportant des effets secondaires, de sorte que les appels vers ces fonctions ne puissent pas être optimisés.

Les exemples suivants présentent des fonctions volatiles.

SELECT proname, provolatile FROM pg_proc WHERE proname='pg_sleep'; proname | provolatile ----------+------------- pg_sleep | v (1 row) SELECT proname, provolatile FROM pg_proc WHERE proname='uuid_generate_v4'; proname | provolatile ------------------+------------- uuid_generate_v4 | v (1 row) SELECT proname, provolatile FROM pg_proc WHERE proname='nextval'; proname | provolatile ---------+------------- nextval | v (1 row)

La modification de la volatilité d'une fonction existante n'est pas prise en charge dans la base de données Aurora PostgreSQL Limitless. Cela s'applique à la fois aux CREATE OR REPLACE FUNCTION commandes ALTER FUNCTION et, comme indiqué dans les exemples suivants.

-- Create an immutable function CREATE FUNCTION immutable_func1(name text) RETURNS text language plpgsql AS $$ BEGIN RETURN name; END; $$IMMUTABLE; -- Altering the volatility throws an error ALTER FUNCTION immutable_func1 STABLE; -- Replacing the function with altered volatility throws an error CREATE OR REPLACE FUNCTION immutable_func1(name text) RETURNS text language plpgsql AS $$ BEGIN RETURN name; END; $$VOLATILE;

Nous vous recommandons vivement d'attribuer les volatilités correctes aux fonctions. Par exemple, si votre fonction utilise plusieurs tables ou fait référence SELECT à des objets de base de données, ne la définissez pas commeIMMUTABLE. Si le contenu de la table change, l'immuabilité est rompue.

Aurora PostgreSQL SELECT autorise des fonctions immuables internes, mais les résultats peuvent être incorrects. La base de données Aurora PostgreSQL Limitless peut renvoyer à la fois des erreurs et des résultats incorrects. Pour plus d'informations sur la volatilité des fonctions, consultez la section Catégories de volatilité des fonctions dans la documentation de PostgreSQL.

Séquences

Les séquences nommées sont des objets de base de données qui génèrent des numéros uniques par ordre croissant ou décroissant. CREATE SEQUENCEcrée un nouveau générateur de numéros de séquence. L'unicité des valeurs de séquence est garantie.

Lorsque vous créez une séquence nommée dans la base de données Aurora PostgreSQL Limitless, un objet de séquence distribué est créé. La base de données Aurora PostgreSQL Limitless distribue ensuite des fragments de valeurs de séquence ne se chevauchant pas sur tous les routeurs de transactions distribués (routeurs). Les segments sont représentés sous forme d'objets de séquence locaux sur les routeurs ; par conséquent, les opérations de séquence telles que nextval et currval sont exécutées localement. Les routeurs fonctionnent indépendamment et demandent de nouveaux fragments à partir de la séquence distribuée en cas de besoin.

Pour plus d'informations sur les séquences, consultez CREATE SEQUENCE dans la documentation de PostgreSQL.

Demande d'un nouveau morceau

Vous configurez la taille des segments alloués sur les routeurs à l'aide du rds_aurora.limitless_sequence_chunk_size paramètre. La valeur par défaut est 250000. Chaque routeur possède initialement deux segments : actif et réservé. Les fragments actifs sont utilisés pour configurer les objets de séquence locaux (paramètre minvalue etmaxvalue), et les fragments réservés sont stockés dans une table de catalogue interne. Lorsqu'un segment actif atteint la valeur minimale ou maximale, il est remplacé par le segment réservé. Pour ce faire, c'ALTER SEQUENCEest utilisé en interne, AccessExclusiveLock c'est-à-dire acquis.

Les programmes de travail en arrière-plan s'exécutent toutes les 10 secondes sur les nœuds du routeur pour scanner les séquences à la recherche de fragments réservés utilisés. Si un fragment utilisé est trouvé, le travailleur demande un nouveau morceau à partir de la séquence distribuée. Assurez-vous de définir une taille de fragment suffisamment grande pour que les travailleurs en arrière-plan aient suffisamment de temps pour en demander de nouveaux. Les demandes à distance ne se produisent jamais dans le contexte des sessions utilisateur, ce qui signifie que vous ne pouvez pas demander directement une nouvelle séquence.

Limites

Les limitations suivantes s'appliquent aux séquences dans la base de données Aurora PostgreSQL Limitless :

  • Le pg_sequence catalogue, la pg_sequences fonction et l'SELECT * FROM sequence_nameinstruction affichent tous uniquement l'état de séquence local, et non l'état distribué.

  • Il est garanti que les valeurs de séquence sont uniques et qu'elles seront monotones au cours d'une session. Mais elles peuvent être désordonnées avec des nextval instructions exécutées dans d'autres sessions, si ces sessions sont connectées à d'autres routeurs.

  • Assurez-vous que la taille de séquence (nombre de valeurs disponibles) est suffisamment grande pour être répartie sur tous les routeurs. Utilisez le rds_aurora.limitless_sequence_chunk_size paramètre pour configurer lechunk_size. (Chaque routeur comporte deux segments.)

  • L'CACHEoption est prise en charge, mais le cache doit être inférieur àchunk_size.

Options non prises en charge

Les options suivantes ne sont pas prises en charge pour les séquences dans la base de données Aurora PostgreSQL Limitless.

Fonctions de manipulation de séquence

La setval fonction n'est pas prise en charge. Pour plus d'informations, consultez la section Fonctions de manipulation de séquences dans la documentation de PostgreSQL.

CRÉER UNE SÉQUENCE

Les options suivantes ne sont pas prises en charge.

CREATE [{ TEMPORARY | TEMP} | UNLOGGED] SEQUENCE [[ NO ] CYCLE]

Pour plus d'informations, consultez CREATE SEQUENCE dans la documentation de PostgreSQL.

MODIFIER LA SÉQUENCE

Les options suivantes ne sont pas prises en charge.

ALTER SEQUENCE [[ NO ] CYCLE]

Pour plus d'informations, consultez ALTER SEQUENCE dans la documentation de PostgreSQL.

ALTER TABLE

La ALTER TABLE commande n'est pas prise en charge pour les séquences.

Exemples

CRÉER/SUPPRIMER UNE SÉQUENCE
postgres_limitless=> CREATE SEQUENCE s; CREATE SEQUENCE postgres_limitless=> SELECT nextval('s'); nextval --------- 1 (1 row) postgres_limitless=> SELECT * FROM pg_sequence WHERE seqrelid='s'::regclass; seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle ----------+----------+----------+--------------+--------+--------+----------+---------- 16960 | 20 | 1 | 1 | 10000 | 1 | 1 | f (1 row) % connect to another router postgres_limitless=> SELECT nextval('s'); nextval --------- 10001 (1 row) postgres_limitless=> SELECT * FROM pg_sequence WHERE seqrelid='s'::regclass; seqrelid | seqtypid | seqstart | seqincrement | seqmax | seqmin | seqcache | seqcycle ----------+----------+----------+--------------+--------+--------+----------+---------- 16959 | 20 | 10001 | 1 | 20000 | 10001 | 1 | f (1 row) postgres_limitless=> DROP SEQUENCE s; DROP SEQUENCE
MODIFIER LA SÉQUENCE
postgres_limitless=> CREATE SEQUENCE s; CREATE SEQUENCE postgres_limitless=> ALTER SEQUENCE s RESTART 500; ALTER SEQUENCE postgres_limitless=> SELECT nextval('s'); nextval --------- 500 (1 row) postgres_limitless=> SELECT currval('s'); currval --------- 500 (1 row)
Fonctions de manipulation de séquence
postgres=# CREATE TABLE t(a bigint primary key, b bigint); CREATE TABLE postgres=# CREATE SEQUENCE s minvalue 0 START 0; CREATE SEQUENCE postgres=# INSERT INTO t VALUES (nextval('s'), currval('s')); INSERT 0 1 postgres=# INSERT INTO t VALUES (nextval('s'), currval('s')); INSERT 0 1 postgres=# SELECT * FROM t; a | b ---+--- 0 | 0 1 | 1 (2 rows) postgres=# ALTER SEQUENCE s RESTART 10000; ALTER SEQUENCE postgres=# INSERT INTO t VALUES (nextval('s'), currval('s')); INSERT 0 1 postgres=# SELECT * FROM t; a | b -------+------- 0 | 0 1 | 1 10000 | 10000 (3 rows)

Vues de séquence

La base de données Aurora PostgreSQL Limitless fournit les vues suivantes pour les séquences.

rds_aurora.séquence_distribute_illimitée

Cette vue montre l'état et la configuration d'une séquence distribuée. Les cache colonnes minvaluemaxvalue,start,inc, et ont la même signification que dans la vue pg_sequences et indiquent les options avec lesquelles la séquence a été créée. La lastval colonne indique la dernière valeur allouée ou réservée dans un objet de séquence distribuée. Cela ne signifie pas que la valeur a déjà été utilisée, car les routeurs conservent les segments de séquence localement.

postgres_limitless=> SELECT * FROM rds_aurora.limitless_distributed_sequence WHERE sequence_name='test_serial_b_seq'; schema_name | sequence_name | lastval | minvalue | maxvalue | start | inc | cache -------------+-------------------+---------+----------+------------+-------+-----+------- public | test_serial_b_seq | 1250000 | 1 | 2147483647 | 1 | 1 | 1 (1 row)
rds_aurora.limitless_sequence_metadata

Cette vue montre les métadonnées de séquence distribuées et agrège les métadonnées de séquence provenant des nœuds du cluster. Il utilise les colonnes suivantes :

  • subcluster_id— L'ID du nœud du cluster qui possède un segment.

  • Fragment actif : fragment d'une séquence en cours d'utilisation (active_minvalue,active_maxvalue).

  • Bloc réservé — Le segment local qui sera utilisé ensuite (reserved_minvalue,reserved_maxvalue).

  • local_last_value— Dernière valeur observée à partir d'une séquence locale.

  • chunk_size— La taille d'un morceau, telle que configurée lors de sa création.

postgres_limitless=> SELECT * FROM rds_aurora.limitless_sequence_metadata WHERE sequence_name='test_serial_b_seq' order by subcluster_id; subcluster_id | sequence_name | schema_name | active_minvalue | active_maxvalue | reserved_minvalue | reserved_maxvalue | chunk_size | chunk_state | local_last_value ---------------+-------------------+-------------+-----------------+-----------------+-------------------+-------------------+------------+-------------+------------------ 1 | test_serial_b_seq | public | 500001 | 750000 | 1000001 | 1250000 | 250000 | 1 | 550010 2 | test_serial_b_seq | public | 250001 | 500000 | 750001 | 1000000 | 250000 | 1 | (2 rows)

Résolution des problèmes de séquence

Les problèmes suivants peuvent survenir avec les séquences.

La taille des morceaux n'est pas assez grande

Si la taille des fragments n'est pas définie suffisamment et que le taux de transaction est élevé, les travailleurs en arrière-plan n'auront peut-être pas le temps de demander de nouveaux fragments avant que les segments actifs ne soient épuisés. Cela peut entraîner des conflits et des événements d'attente tels queLIMITLESS:AuroraLimitlessSequenceReplace, LWLock:LockManagerLockrelation, etLWlock:bufferscontent.

Augmentez la valeur du paramètre rds_aurora.limitless_sequence_chunk_size.

Le cache de séquence est défini trop haut

Dans PostgreSQL, la mise en cache des séquences s'effectue au niveau de la session. Chaque session alloue des valeurs de séquence successives lors d'un accès à l'objet de séquence et augmente le nombre de valeurs de l'objet de last_value séquence en conséquence. Ensuite, les utilisations suivantes de cette nextval session renvoient simplement les valeurs préallouées sans toucher à l'objet de séquence.

Tous les numéros alloués mais non utilisés au cours d'une session sont perdus à la fin de cette session, ce qui entraîne des « trous » dans la séquence. Cela peut rapidement consommer le sequence_chunk et entraîner des conflits et des événements d'attente tels queLIMITLESS:AuroraLimitlessSequenceReplace,, et. LWLock:LockManager Lockrelation LWlock:bufferscontent

Réduisez le paramètre du cache de séquences.

La figure suivante montre les événements d'attente provoqués par des problèmes de séquence.

Événements d'attente provoqués par des problèmes de séquence.