Seleccione sus preferencias de cookies

Usamos cookies esenciales y herramientas similares que son necesarias para proporcionar nuestro sitio y nuestros servicios. Usamos cookies de rendimiento para recopilar estadísticas anónimas para que podamos entender cómo los clientes usan nuestro sitio y hacer mejoras. Las cookies esenciales no se pueden desactivar, pero puede hacer clic en “Personalizar” o “Rechazar” para rechazar las cookies de rendimiento.

Si está de acuerdo, AWS y los terceros aprobados también utilizarán cookies para proporcionar características útiles del sitio, recordar sus preferencias y mostrar contenido relevante, incluida publicidad relevante. Para aceptar o rechazar todas las cookies no esenciales, haga clic en “Aceptar” o “Rechazar”. Para elegir opciones más detalladas, haga clic en “Personalizar”.

Limitaciones del DDL y otra información para Base de datos ilimitada de Aurora PostgreSQL - Amazon Aurora

Limitaciones del DDL y otra información para Base de datos ilimitada de Aurora PostgreSQL

En los siguientes temas se describen las limitaciones o se proporciona más información sobre los comandos DDL SQL en Base de datos ilimitada de Aurora PostgreSQL.

ALTER TABLE

El comando ALTER TABLE es compatible de forma generalizada con Base de datos ilimitada de Aurora PostgreSQL. Para obtener más información, consulte ALTER ROLE en la documentación de PostgreSQL.

Limitaciones

ALTER TABLE tiene las siguientes limitaciones en cuanto a las opciones compatibles.

Eliminación de columnas
  • En las tablas particionadas, no se pueden eliminar las columnas que forman parte de la clave de partición.

  • En las tablas de referencia, no se pueden eliminar las columnas de clave principal.

Cambio del tipo de datos de una columna
  • La expresión USING no se admite.

  • En las tablas particionadas, no puede eliminar las columnas que forman parte de la clave de partición.

Agregación o eliminación de una restricción

Para obtener más información sobre lo que no se admite, consulte Restricciones.

Cambio del valor predeterminado de una columna

Se admiten los valores predeterminados. Para obtener más información, consulte Valores predeterminados.

Opciones no admitidas

Algunas opciones no son compatibles porque dependen de características no compatibles, como los desencadenadores.

Las siguientes opciones de nivel de tabla para ALTER TABLE no son compatibles:

  • ALL IN TABLESPACE

  • ATTACH PARTITION

  • DETACH PARTITION

  • Indicador ONLY

  • RENAME CONSTRAINT

Las siguientes opciones de nivel de columna para ALTER TABLE no son compatibles:

  • ADD GENERATED

  • DROP EXPRESSION [ IF EXISTS ]

  • DROP IDENTITY [ IF EXISTS ]

  • RESET

  • RESTART

  • SET

  • SET COMPRESSION

  • SET STATISTICS

CREATE DATABASE

En Base de datos ilimitada de Aurora PostgreSQL, solo se admiten bases de datos ilimitadas.

Mientras se ejecuta CREATE DATABASE, las bases de datos creadas correctamente en uno o más nodos pueden fallar en otros nodos, ya que la creación de bases de datos no es una operación transaccional. En este caso, los objetos de la base de datos creados correctamente se eliminan automáticamente de todos los nodos dentro de un período de tiempo predeterminado para mantener la coherencia en el grupo de particiones de base de datos. Durante este tiempo, si se vuelve a crear una base de datos con el mismo nombre, se puede producir un error que indique que la base de datos ya existe.

Las siguientes opciones son compatibles:

  • Intercalación:

    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;

Las siguientes opciones no son compatibles:

  • CREATE DATABASE WITH TABLESPACE:

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

    CREATE DATABASE name WITH TEMPLATE = template;

CREATE INDEX

Se admite CREATE INDEX CONCURRENTLY en las tablas particionadas:

CREATE INDEX CONCURRENTLY index_name ON table_name(column_name);

Se admite CREATE UNIQUE INDEX para todos los tipos de tabla:

CREATE UNIQUE INDEX index_name ON table_name(column_name);

No se admite CREATE UNIQUE INDEX CONCURRENTLY:

CREATE UNIQUE INDEX CONCURRENTLY index_name ON table_name(column_name);

Para obtener más información, consulte UNIQUE. Para obtener información general sobre la creación de índices, consulte CREATE INDEX en la documentación de PostgreSQL.

Visualización de índices

No todos los índices son visibles en los enrutadores cuando se utiliza \d table_name o comandos similares. En su lugar, utilice la vista pg_catalog.pg_indexes para obtener índices, tal y como se muestra en el siguiente ejemplo.

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

No se admite CREATE SCHEMA con un elemento de esquema:

CREATE SCHEMA my_schema CREATE TABLE (column_name INT);

Este comando genera un error similar al siguiente:

ERROR: CREATE SCHEMA with schema elements is not supported

CREATE TABLE

No se admiten relaciones en las instrucciones CREATE TABLE, como:

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

No se admiten las columnas IDENTITY, como:

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

CREATE TABLE AS

Para crear una tabla con CREATE TABLE AS, debe usar la variable rds_aurora.limitless_create_table_mode. Para las tablas particionadas, también debe usar la variable rds_aurora.limitless_create_table_shard_key. Para obtener más información, consulte Creación de tablas ilimitadas con 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;

No se puede utilizar CREATE TABLE AS para crear tablas de referencia, ya que requieren restricciones de clave principal. CREATE TABLE AS no propaga las claves principales a las tablas nuevas.

Para obtener más información, consulte CREATE TABLE AS en la documentación de PostgreSQL.

DROP DATABASE

Puede eliminar las bases de datos que haya creado.

El comando DROP DATABASE se ejecuta de forma asíncrona en segundo plano. Mientras se está ejecutando, recibirá un error si intenta crear una nueva base de datos con el mismo nombre.

SELECT INTO

SELECT INTO es funcionalmente similar a CREATE TABLE AS. Debe usar la variable rds_aurora.limitless_create_table_mode. Para las tablas particionadas, también debe usar la variable rds_aurora.limitless_create_table_shard_key. Para obtener más información, consulte Creación de tablas ilimitadas con 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;

Actualmente, la operación SELECT INTO se realiza a través del enrutador, no directamente a través de las particiones. Por lo tanto, el rendimiento puede ser lento.

Para obtener más información, consulte SELECT INTO en la documentación de PostgreSQL.

Restricciones

Las siguientes limitaciones se aplican a las restricciones en Base de datos ilimitada de Aurora PostgreSQL.

CHECK

Se admiten restricciones simples que implican operadores de comparación con literales. No se admiten expresiones ni restricciones más complejas que requieren validaciones de funciones, tal como se muestra en los siguientes ejemplos.

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" );

También puede asignar nombres explícitos a las restricciones, tal como se muestra en el siguiente ejemplo.

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

Puede utilizar la sintaxis de restricciones de nivel de tabla con la restricción CHECK, tal como se muestra en el siguiente ejemplo.

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

Las restricciones de exclusión no se admiten en Base de datos ilimitada de Aurora PostgreSQL.

FOREIGN KEY

Para obtener más información, consulte Claves externas.

NOT NULL

Las restricciones NOT NULL se admiten sin restricciones.

PRIMARY KEY

La clave principal implica restricciones únicas y, por lo tanto, las mismas restricciones a las restricciones únicas se aplican a la clave principal. Esto significa:

  • Que si una tabla se convierte en tabla particionada, la clave de partición debe ser un subconjunto de la clave principal. Es decir, la clave principal contiene todas las columnas de la clave de partición.

  • Si una tabla se convierte en una tabla de referencia, debe tener una clave principal.

En los siguientes ejemplos se ilustra el uso de claves principales.

-- 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']);

Aquí se intenta añadir una clave principal que no contiene una clave de partición:

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

Aquí se intenta añadir una clave principal que contiene una clave de partición:

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

Cambie una tabla estándar por una tabla de referencia.

-- 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');

Para obtener más información sobre la creación de tablas particionadas y de referencia, consulte Creación de tablas de Base de datos ilimitada de Aurora PostgreSQL.

UNIQUE

En las tablas particionadas, la clave única debe contener la clave de partición, es decir, la clave de partición debe ser un subconjunto de la clave única. Esto se comprueba al cambiar el tipo de tabla a particionada. En las tablas de referencia no hay ninguna restricción.

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

Se admiten restricciones UNIQUE en el nivel de tabla, tal como se muestra en el siguiente ejemplo.

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

El siguiente ejemplo muestra el uso conjunto de una clave principal y una clave única. Ambas claves deben incluir la clave de partición.

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) );

Para obtener más información, consulte Constraints en la documentación de PostgreSQL.

Valores predeterminados

Base de datos ilimitada de Aurora PostgreSQL admite expresiones con valores predeterminados.

En el siguiente ejemplo se muestra el uso de los valores predeterminados.

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)

Se admiten expresiones, como las del siguiente ejemplo.

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

En el siguiente ejemplo, se agrega una nueva columna que es NOT NULL y tiene un valor predeterminado.

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

En el siguiente ejemplo, se modifica una columna existente con un valor predeterminado.

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)

En el siguiente ejemplo, se elimina un valor predeterminado.

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)

Para obtener más información, consulte Default values en la documentación de PostgreSQL.

Extensiones

Las siguientes extensiones de PostgreSQL son compatibles con Base de datos ilimitada de Aurora PostgreSQL:

La mayoría de extensiones de PostgreSQL no son compatibles con Base de datos ilimitada de Aurora PostgreSQL. Sin embargo, puede seguir utilizando el parámetro de configuración shared_preload_libraries (SPL) para cargar extensiones en el clúster de base de datos principal de Aurora PostgreSQL. También se cargan en Base de datos ilimitada de Aurora PostgreSQL, pero es posible que no funcionen correctamente.

Por ejemplo, puede cargar la extensión pg_hint_plan, pero cargarla no garantiza que se utilicen las sugerencias incluidas en los comentarios de las consultas.

nota

No se pueden modificar los objetos asociados a la extensión pg_stat_statements. Para obtener más información sobre la instalación de pg_stat_statements, consulte limitless_stat_statements.

Puede utilizar las funciones pg_available_extensions y pg_available_extension_versions para buscar las extensiones compatibles con Base de datos ilimitada de Aurora PostgreSQL.

Los siguientes DDL admiten las extensiones:

CREATE EXTENSION

Puede crear extensiones, como en PostgreSQL.

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

Para obtener más información, consulte CREATE EXTENSION en la documentación de PostgreSQL.

ALTER EXTENSION

Se admiten los siguientes DDL:

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

Para obtener más información, consulte ALTER EXTENSION en la documentación de PostgreSQL.

DROP EXTENSION

Puede eliminar extensiones, como en PostgreSQL.

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

Para obtener más información, consulte DROP EXTENSION en la documentación de PostgreSQL.

Los siguientes DDL no admiten extensiones:

ALTER EXTENSION

No se pueden agregar ni eliminar objetos miembros de extensiones.

ALTER EXTENSION name ADD member_object ALTER EXTENSION name DROP member_object

Diferencias de pg_buffercache en Base de datos ilimitada de Aurora PostgreSQL

En Base de datos ilimitada de Aurora PostgreSQL, al instalar la extensión pg_buffercache y usar la vista pg_buffercache, recibirá información relacionada con el búfer únicamente del nodo al que está conectado actualmente, es decir, el enrutador. Del mismo modo, al utilizar la función pg_buffercache_summary o pg_buffercache_usage_counts se proporciona información únicamente del nodo conectado.

Puede tener varios nodos y es posible que necesite acceder a la información del búfer desde cualquier nodo para diagnosticar los problemas de forma eficaz. Por lo tanto, Base de datos ilimitada ofrece las siguientes funciones:

  • rds_aurora.limitless_pg_buffercache(subcluster_id)

  • rds_aurora.limitless_pg_buffercache_summary(subcluster_id)

  • rds_aurora.limitless_pg_buffercache_usage_counts(subcluster_id)

Al introducir el ID de subclúster de cualquier nodo, ya sea un enrutador o una partición, puede acceder fácilmente a la información del búfer específica de ese nodo. Estas funciones están disponibles directamente al instalar la extensión pg_buffercache en la base de datos ilimitada.

nota

Base de datos ilimitada de Aurora PostgreSQL admite estas funciones en la versión 1.4 y posteriores de la extensión pg_buffercache.

Las columnas que se muestran en la vista limitless_pg_buffercache difieren ligeramente de las de la vista pg_buffercache:

  • bufferid: permanece sin cambios por parte de pg_buffercache.

  • relname: en lugar de mostrar el número de nodo del archivo como en pg_buffercache, limitless_pg_buffercache presenta el relname asociado si está disponible en la base de datos actual o en los catálogos del sistema particionado; de lo contrario es NULL.

  • parent_relname: esta nueva columna, que no está presente en pg_buffercache, muestra la columna principal relname si el valor de la columna relname representa una tabla particionada (en el caso de las tablas particionadas). De lo contrario, se muestra NULL.

  • spcname: en lugar de mostrar el identificador del objeto del espacio de tabla (OID) como en pg_buffercache, limitless_pg_buffercache muestra el nombre del espacio de tabla.

  • datname: en lugar de mostrar el OID de la base de datos como en pg_buffercache, limitless_pg_buffercache muestra el nombre de la base de datos.

  • relforknumber: permanece sin cambios por parte de pg_buffercache.

  • relblocknumber: permanece sin cambios por parte de pg_buffercache.

  • isdirty: permanece sin cambios por parte de pg_buffercache.

  • usagecount: permanece sin cambios por parte de pg_buffercache.

  • pinning_backends: permanece sin cambios por parte de pg_buffercache.

Las columnas de las vistas limitless_pg_buffercache_summary y limitless_pg_buffercache_usage_counts son las mismas que las de las vistas normales pg_buffercache_summary y pg_buffercache_usage_counts, respectivamente.

Al utilizar estas funciones, puede acceder a información detallada de la memoria caché del búfer en todos los nodos de su entorno de Base de datos ilimitada, lo que facilita un diagnóstico y una administración más eficaces de sus sistemas de bases de datos.

Diferencias de pgstattuple en Base de datos ilimitada de Aurora PostgreSQL

En Aurora PostgreSQL, la extensión pgstattuple actualmente no admite tablas externas, tablas particionadas ni índices particionados. En Base de datos ilimitada de Aurora PostgreSQL, los objetos creados por los usuarios suelen estar entre estos tipos no compatibles. Si bien hay tablas e índices normales (por ejemplo, tablas de catálogos y sus índices), la mayoría de los objetos residen en nodos externos, lo que los convierte en objetos extraños para el enrutador.

Reconocemos la importancia de esta extensión para obtener estadísticas en el nivel de tupla, lo cual es esencial para tareas como eliminar la sobrecarga y recopilar información de diagnóstico. Por lo tanto, Base de datos ilimitada de Aurora PostgreSQL admite la extensión pgstattuple en bases de datos ilimitadas.

Base de datos ilimitada de Aurora PostgreSQL incluye las siguientes funciones en el esquema rds_aurora:

Funciones estadísticas en el nivel de tupla

rds_aurora.limitless_pgstattuple(relation_name)

  • Objetivo: extraer estadísticas en el nivel de tupla para tablas estándar y sus índices

  • Entrada: relation_name (texto) es el nombre de la relación

  • Salida: columnas coherentes con las devueltas por la función pgstattuple en Aurora PostgreSQL

rds_aurora.limitless_pgstattuple(relation_name, subcluster_id)

  • Objetivo: extraer estadísticas en el nivel de tupla para las tablas de referencia, las tablas particionadas, las tablas de catálogo y sus índices

  • Input:

    • relation_name (texto): es el nombre de la relación

    • subcluster_id (texto): es el ID del subclúster del nodo donde se van a extraer las estadísticas

  • Salida:

    • En el caso de las tablas de referencia y de catálogo (incluidos sus índices), las columnas son coherentes con las de Aurora PostgreSQL.

    • En el caso de las tablas particionadas, las estadísticas representan únicamente la partición de la tabla particionada que reside en el subclúster especificado.

Funciones de estadísticas de índices

rds_aurora.limitless_pgstatindex(relation_name)

  • Objetivo: extraer estadísticas para los índices del árbol B en tablas estándar

  • Entrada: relation_name (texto) es el nombre del índice del árbol B

  • Salida: se devuelven todas las columnas excepto root_block_no. Las columnas devueltas son coherentes con la función pgstatindex en Aurora PostgreSQL

rds_aurora.limitless_pgstatindex(relation_name, subcluster_id)

  • Objetivo: extraer estadísticas para los índices del árbol B en las tablas de referencia, las tablas particionadas y las tablas de catálogo

  • Input:

    • relation_name (texto): es el nombre del índice del árbol B

    • subcluster_id (texto): es el ID del subclúster del nodo donde se van a extraer las estadísticas

  • Salida:

    • Para los índices de las tablas de referencia y de catálogo, se devuelven todas las columnas (excepto root_block_no). Las columnas devueltas son coherentes con Aurora PostgreSQL.

    • En el caso de las tablas particionadas, las estadísticas representan únicamente la partición del índice de la tabla particionada que reside en el subclúster especificado. La columna tree_level muestra el promedio de todos los segmentos de la tabla del subclúster solicitado.

rds_aurora.limitless_pgstatginindex(relation_name)

  • Objetivo: extraer estadísticas de índices invertidos generalizados (GIN) en tablas estándar

  • Entrada: relation_name (texto) es el nombre del GIN

  • Salida: columnas coherentes con las devueltas por la función pgstatginindex en Aurora PostgreSQL

rds_aurora.limitless_pgstatginindex(relation_name, subcluster_id)

  • Objetivo: extraer estadísticas para los índices GIN en las tablas de referencia, las tablas particionadas y las tablas de catálogo

  • Input:

    • relation_name (texto): es el nombre del índice

    • subcluster_id (texto): es el ID del subclúster del nodo donde se van a extraer las estadísticas

  • Salida:

    • En el caso de los índices GIN de las tablas de referencia y de catálogo, las columnas son coherentes con las de Aurora PostgreSQL.

    • En el caso de las tablas particionadas, las estadísticas representan únicamente la partición del índice de la tabla particionada que reside en el subclúster especificado.

rds_aurora.limitless_pgstathashindex(relation_name)

  • Objetivo: extraer estadísticas para los índices hash en tablas estándar

  • Entrada: relation_name (texto) es el nombre del índice hash

  • Salida: columnas coherentes con las devueltas por la función pgstathashindex en Aurora PostgreSQL

rds_aurora.limitless_pgstathashindex(relation_name, subcluster_id)

  • Objetivo: extraer estadísticas para los índices hash en las tablas de referencia, las tablas particionadas y las tablas de catálogo

  • Input:

    • relation_name (texto): es el nombre del índice

    • subcluster_id (texto): es el ID del subclúster del nodo donde se van a extraer las estadísticas

  • Salida:

    • Para los índices hash de las tablas de referencia y de catálogo, las columnas son coherentes con Aurora PostgreSQL.

    • En el caso de las tablas particionadas, las estadísticas representan únicamente la partición del índice de la tabla particionada que reside en el subclúster especificado.

Funciones de recuento de páginas

rds_aurora.limitless_pg_relpages(relation_name)

  • Objetivo: extraer el recuento de páginas de las tablas estándar y sus índices

  • Entrada: relation_name (texto) es el nombre de la relación

  • Salida: recuento de páginas de la relación especificada

rds_aurora.limitless_pg_relpages(relation_name, subcluster_id)

  • Objetivo: extraer el recuento de páginas de las tablas de referencia, las tablas particionadas y las tablas de catálogo (incluidos sus índices)

  • Input:

    • relation_name (texto): es el nombre de la relación

    • subcluster_id (texto): es el ID del subclúster del nodo de donde se va a extraer el recuento de páginas

  • Salida: en el caso de las tablas particionadas, el recuento de páginas es la suma de las páginas de todos los segmentos de la tabla del subclúster especificado.

Funciones estadísticas aproximadas en el nivel de tupla

rds_aurora.limitless_pgstattuple_approx(relation_name)

  • Objetivo: extraer estadísticas aproximadas en el nivel de tupla para las tablas estándar y sus índices

  • Entrada: relation_name (texto) es el nombre de la relación

  • Salida: columnas coherentes con las devueltas por la función pgstattuple_approx en Aurora PostgreSQL

rds_aurora.limitless_pgstattuple_approx(relation_name, subcluster_id)

  • Objetivo: extraer estadísticas aproximadas en el nivel de tupla para las tablas de referencia, las tablas particionadas y las tablas de catálogo (con sus índices)

  • Input:

    • relation_name (texto): es el nombre de la relación

    • subcluster_id (texto): es el ID del subclúster del nodo donde se van a extraer las estadísticas

  • Salida:

    • En el caso de las tablas de referencia y de catálogo (incluidos sus índices), las columnas son coherentes con las de Aurora PostgreSQL.

    • En el caso de las tablas particionadas, las estadísticas representan únicamente la partición de la tabla particionada que reside en el subclúster especificado.

nota

Actualmente, Base de datos ilimitada de Aurora PostgreSQL no admite la extensión pgstattuple en vistas materializadas, tablas TOAST o tablas temporales.

En Base de datos ilimitada de Aurora PostgreSQL, debe proporcionar la entrada como texto, aunque Aurora PostgreSQL admite otros formatos.

Claves externas

Se admiten las restricciones de clave externa (FOREIGN KEY) con algunas limitaciones:

  • Se admite CREATE TABLE con FOREIGN KEY solo en tablas estándar. Para crear una tabla particionada o de referencia con FOREIGN KEY, primero debe crear la tabla sin una restricción de clave externa. A continuación, modifíquela con la siguiente instrucción:

    ALTER TABLE ADD CONSTRAINT;
  • No se admite la conversión de una tabla estándar en una tabla particionada o de referencia cuando la tabla tiene una restricción de clave externa. Elimine la restricción y agréguela después de la conversión.

  • Se aplican las siguientes limitaciones a los tipos de tabla para restricciones de clave externa:

    • Una tabla estándar puede tener una restricción de clave externa a otra tabla estándar.

    • Una tabla particionada puede tener una restricción de clave externa si las tablas principal y secundaria están colocadas y la clave externa es un superconjunto de la clave de partición.

    • Una tabla particionada puede tener una restricción de clave externa a una tabla de referencia.

    • Una tabla particionada puede tener una restricción de clave externa a otra tabla de referencia.

Opciones de clave externa

Algunas opciones de DDL admiten claves externas en Base de datos ilimitada de Aurora PostgreSQL. En la siguiente tabla se enumeran las opciones compatibles y no compatibles entre las tablas de Base de datos ilimitada de Aurora PostgreSQL.

Opción de DDL De referencia a de referencia De particionada a particionada (colocada) De particionada a de referencia De estándar a estándar

DEFERRABLE

INITIALLY DEFERRED

INITIALLY IMMEDIATE

MATCH FULL

MATCH PARTIAL

No No No No

MATCH SIMPLE

NOT DEFERRABLE

NOT VALID

No No

ON DELETE CASCADE

ON DELETE NO ACTION

ON DELETE RESTRICT

ON DELETE SET DEFAULT

No No No No

ON DELETE SET NULL

No No

ON UPDATE CASCADE

No No No

ON UPDATE NO ACTION

ON UPDATE RESTRICT

ON UPDATE SET DEFAULT

No No No No

ON UPDATE SET NULL

No No

Ejemplos

  • De estándar a estándar:

    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)
  • De particionada a particionada (colocada):

    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);
  • De particionada a de referencia:

    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);
  • De referencia a de referencia:

    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);

Funciones

Base de datos ilimitada de Aurora PostgreSQL admite funciones.

Se admiten los siguientes DDL para las funciones:

CREATE FUNCTION

Puede crear funciones, como en Aurora PostgreSQL, menos cambiar su volatilidad al sustituirlas.

Para obtener más información, consulte CREATE FUNCTION en la documentación de PostgreSQL.

ALTER FUNCTION

Puede modificar funciones, como en Aurora PostgreSQL, menos modificar su volatilidad.

Para obtener más información, consulte ALTER FUNCTION en la documentación de PostgreSQL.

DROP FUNCTION

Puede eliminar funciones, como en Aurora PostgreSQL.

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

Para obtener más información, consulte DROP FUNCTION en la documentación de PostgreSQL.

Distribución de funciones

Cuando todas las instrucciones de una función están dirigidas a una única partición, resulta beneficioso colocar toda la función en la partición de destino. Luego, el resultado se propaga de nuevo al enrutador, en lugar de desentrañar la función en el propio enrutador. La función de compresión de funciones y procedimientos almacenados resulta útil para los clientes que desean ejecutar su función o procedimiento almacenado más cerca del origen de datos, es decir, de la partición.

Para distribuir una función, primero debe crear la función y, a continuación, llamar al procedimiento rds_aurora.limitless_distribute_function para distribuirla. Esta función usa la siguiente sintaxis:

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

La función toma los siguientes parámetros:

  • function_prototype: es la función que se va a distribuir. Mencione solo los argumentos de entrada y ningún argumento de salida.

    Si alguno de los argumentos está definido como parámetro OUT, no incluya su tipo en los argumentos de function_prototype.

  • ARRAY['shard_key']: es la lista de argumentos de la función que se identifica como la clave de partición de la función.

  • collocating_table: es la tabla particionada que contiene el rango de datos de la partición de destino.

Para identificar la partición en la que se debe presionar esta función para ejecutarla, el sistema toma el argumento ARRAY['shard_key'], lo convierte en un hash y busca la partición de collocating_table que aloja el rango que contiene este valor de hash.

Restricciones

Al distribuir una función o un procedimiento, solo se ocupa de los datos que están limitados por el rango de claves de partición de dicha partición. En los casos en que la función o el procedimiento intenten acceder a los datos de una partición diferente, los resultados devueltos por la función o el procedimiento distribuidos serán diferentes de los que no estén distribuidos.

Por ejemplo, se crea una función que contiene consultas que tocarán varias particiones, pero después se llama al procedimiento rds_aurora.limitless_distribute_function para distribuirla. Al invocar esta función proporcionando argumentos para una clave de partición, es probable que los resultados de su ejecución estén limitados por los valores presentes en esa partición. Estos resultados son distintos de los que se obtienen sin distribuir la función.

Ejemplos

Considere la función func en la que tenemos la tabla particionada customers con la clave de partición 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; $$;

Ahora distribuimos esta función:

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

A continuación se muestra un ejemplo de planes de consulta.

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)

El siguiente ejemplo muestra un procedimiento con los parámetros IN y OUT como argumentos.

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;

El siguiente ejemplo distribuye el procedimiento utilizando únicamente parámetros IN.

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)

Volatilidad de las funciones

Para determinar si una función es inmutable, estable o volátil, puede comprobar el valor provolatile en la vista pg_proc. El valor provolatile indica si el resultado de la función depende únicamente de sus argumentos de entrada o si se ve afectado por factores externos.

Puede ser uno de los siguientes:

  • i: funciones inmutables, que siempre ofrecen el mismo resultado para las mismas entradas

  • s: funciones estables, cuyos resultados (para entradas fijas) no cambian en un escaneo

  • v: funciones volátiles, cuyos resultados pueden cambiar en cualquier momento. También puede utilizar v para funciones con efectos secundarios, de manera que las llamadas que se realicen no se puedan optimizar.

Los siguientes ejemplos muestran funciones volátiles.

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)

Base de datos ilimitada de Aurora PostgreSQL no admite cambiar la volatilidad de una función existente. Esto se aplica a ambos comandos ALTER FUNCTION y CREATE OR REPLACE FUNCTION, tal como se muestra en los siguientes ejemplos.

-- 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;

Se recomienda asignar las volatilidades correctas a las funciones. Por ejemplo, si la función utiliza SELECT de varias tablas o hace referencia a objetos de bases de datos, no la defina como IMMUTABLE. Si el contenido de la tabla cambia alguna vez, se rompe la inmutabilidad.

Aurora PostgreSQL permite SELECT dentro de funciones inmutables, pero los resultados pueden ser incorrectos. Base de datos ilimitada de Aurora PostgreSQL puede devolver errores y resultados incorrectos. Para obtener más información, consulte Function volatility categories en la documentación de PostgreSQL.

Secuencias

Las secuencias con nombre son objetos de base de datos que generan números únicos en orden ascendente o descendente. CREATE SEQUENCE crea un nuevo generador de números de secuencia. Se garantiza que los valores de secuencia son únicos.

Al crear una secuencia con nombre en Base de datos ilimitada de Aurora PostgreSQL, se crea un objeto de secuencia distribuida. Luego, Base de datos ilimitada de Aurora PostgreSQL distribuye fragmentos de valores de secuencia que no se superponen entre todos los enrutadores de transacciones distribuidas (enrutadores). Los fragmentos se representan como objetos de secuencia local en los enrutadores; por lo tanto, las operaciones de secuencia, como nextval y currval, se ejecutan localmente. Los enrutadores funcionan de forma independiente y solicitan nuevos fragmentos de la secuencia distribuida cuando es necesario.

Para obtener más información sobre las secuencias, consulte CREATE SEQUENCE en la documentación de PostgreSQL.

Solicitud de un nuevo fragmento

Los tamaños de los fragmentos asignados a los enrutadores se configuran con el parámetro rds_aurora.limitless_sequence_chunk_size. El valor predeterminado es 250000. Inicialmente, cada enrutador posee dos fragmentos: uno activo y otro reservado. Los fragmentos activos se utilizan para configurar los objetos de secuencia locales (configuración de minvalue y maxvalue) y los fragmentos reservados se almacenan en una tabla de catálogo interna. Cuando un fragmento activo alcanza el valor mínimo o máximo, se sustituye por el fragmento reservado. Para ello, ALTER SEQUENCE se utiliza internamente, es decir, que AccessExclusiveLock se adquiere.

Los trabajadores en segundo plano se ejecutan cada diez segundos en los nodos del enrutador para escanear las secuencias en busca de fragmentos reservados usados. Si se encuentra un fragmento usado, el trabajador solicita un nuevo fragmento de la secuencia distribuida. Asegúrese de establecer el tamaño del fragmento lo suficientemente grande como para que los trabajadores en segundo plano tengan tiempo suficiente para solicitar otros nuevos. Las solicitudes remotas nunca se realizan en el contexto de las sesiones de usuario, lo que significa que no se puede solicitar una nueva secuencia directamente.

Limitaciones

Las siguientes limitaciones se aplican a las secuencias en Base de datos ilimitada de Aurora PostgreSQL:

  • El catálogo pg_sequence, la función pg_sequences y la instrucción SELECT * FROM sequence_name muestran solo el estado de la secuencia local, no el estado distribuido.

  • Se garantiza que los valores de secuencia son únicos y monótonos dentro de una sesión. Sin embargo, pueden estar desordenados al ejecutar instrucciones nextval en otras sesiones, si esas sesiones están conectadas a otros enrutadores.

  • Asegúrese de que el tamaño de la secuencia (número de valores disponibles) sea lo suficientemente grande como para distribuirse entre todos los enrutadores. Para utilizar el parámetro rds_aurora.limitless_sequence_chunk_size, configure chunk_size. (Cada enrutador tiene dos fragmentos).

  • La opción CACHE es compatible, pero la memoria caché debe ser inferior a chunk_size.

Opciones no admitidas

Las siguientes opciones no se admiten para secuencias en Base de datos ilimitada de Aurora PostgreSQL.

Funciones de manipulación de secuencias

No se admite la función setval. Para obtener más información, consulte Sequence Manipulation Functions en la documentación de PostgreSQL.

CREATE SEQUENCE

No se admiten las siguientes opciones.

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

Para obtener más información, consulte CREATE SEQUENCE en la documentación de PostgreSQL.

ALTER SEQUENCE

No se admiten las siguientes opciones.

ALTER SEQUENCE [[ NO ] CYCLE]

Para obtener más información, consulte ALTER SEQUENCE en la documentación de PostgreSQL.

ALTER TABLE

El comando ALTER TABLE no admite secuencias.

Ejemplos

CREATE/DROP SEQUENCE
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
ALTER SEQUENCE
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)
Funciones de manipulación de secuencias
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)

Vistas de secuencias

Base de datos ilimitada de Aurora PostgreSQL ofrece las siguientes vistas para las secuencias.

rds_aurora.limitless_distributed_sequence

Esta vista muestra el estado y la configuración de una secuencia distribuida. Las columnas minvalue, maxvalue, start, inc y cache tienen el mismo significado en la vista pg_sequences y muestran las opciones con las que se ha creado la secuencia. La columna lastval muestra el último valor asignado o reservado en un objeto de secuencia distribuida. Esto no significa que el valor ya se haya utilizado, ya que los enrutadores mantienen los fragmentos de secuencia de forma local.

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

Esta vista muestra los metadatos de secuencia distribuida y agrega los metadatos de secuencia de los nodos del clúster. Utiliza las siguientes columnas:

  • subcluster_id: es el ID del nodo del clúster que posee un fragmento.

  • Fragmento activo: es un fragmento de una secuencia que se está utilizando (active_minvalue, active_maxvalue).

  • Fragmento reservado: es el fragmento local que se utilizará a continuación (reserved_minvalue, reserved_maxvalue).

  • local_last_value: es el último valor observado de una secuencia local.

  • chunk_size: es el tamaño de un fragmento, tal como se configuró al crearlo.

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)

Solución de problemas con secuencias

Pueden producirse los siguientes problemas con las secuencias.

El tamaño del fragmento no es lo suficientemente grande

Si el tamaño del fragmento no es lo suficientemente grande y la tasa de transacciones es alta, es posible que los trabajadores en segundo plano no tengan tiempo suficiente para solicitar nuevos fragmentos antes de que se agoten los fragmentos activos. Esto puede provocar contención y eventos de espera como LIMITLESS:AuroraLimitlessSequenceReplace, LWLock:LockManager, Lockrelation y LWlock:bufferscontent.

Aumente el valor del parámetro rds_aurora.limitless_sequence_chunk_size.

La caché de secuencias está configurada a un nivel demasiado alto

En PostgreSQL, el almacenamiento en caché de secuencias se produce en el nivel de sesión. Cada sesión asigna valores de secuencia sucesivos durante un acceso al objeto de secuencia y aumenta los last_value del objeto de secuencia en consecuencia. Luego, los siguientes usos de nextval en esa sesión simplemente devuelven los valores preasignados sin tocar el objeto de secuencia.

Los números asignados pero no utilizados en una sesión se pierden al finalizar la sesión, lo que genera huecos en la secuencia. Esto puede consumir el sequence_chunk rápidamente y provocar contención y eventos de espera como LIMITLESS:AuroraLimitlessSequenceReplace, LWLock:LockManager, Lockrelation y LWlock:bufferscontent.

Reduzca la configuración de la caché de secuencias.

La siguiente figura muestra los eventos de espera causados por problemas de secuencia.

Eventos de espera causados por problemas de secuencia.
PrivacidadTérminos del sitioPreferencias de cookies
© 2025, Amazon Web Services, Inc o sus afiliados. Todos los derechos reservados.