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.
Temas
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
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
ONtable_name
(column_name
);
Se admite CREATE UNIQUE INDEX
para todos los tipos de tabla:
CREATE UNIQUE INDEX
index_name
ONtable_name
(column_name
);
No se admite CREATE UNIQUE INDEX CONCURRENTLY
:
CREATE UNIQUE INDEX CONCURRENTLY
index_name
ONtable_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
- Visualización de índices
-
No todos los índices son visibles en los enrutadores cuando se utiliza
\d
o comandos similares. En su lugar, utilice la vistatable_name
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
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
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
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
Extensiones
Las siguientes extensiones de PostgreSQL son compatibles con Base de datos ilimitada de Aurora PostgreSQL:
-
aurora_limitless_fdw
: esta extensión viene preinstalada. No se puede eliminar. -
aws_s3
: esta extensión funciona en Base de datos ilimitada de Aurora PostgreSQL de forma similar a Aurora PostgreSQL.Puede importar datos de un bucket de Amazon S3 a un clúster de base de datos de Base de datos ilimitada de Aurora PostgreSQL o exportar datos desde un clúster de base de datos de Base de datos ilimitada de Aurora PostgreSQL a un bucket de Amazon S3. Para obtener más información, consulte Importación de datos de Amazon S3 en un clúster de base de datos Aurora PostgreSQL y Exportación de datos de una Aurora PostgreSQL de base de datos de clústerde Amazon S3.
-
btree_gin
-
citext
-
ip4r
-
pg_buffercache
: esta extensión se comporta de forma diferente en Base de datos ilimitada de Aurora PostgreSQL y en la comunidad PostgreSQL. Para obtener más información, consulte Diferencias de pg_buffercache en Base de datos ilimitada de Aurora PostgreSQL. -
pg_stat_statements
-
pg_trgm
-
pgcrypto
-
pgstattuple
: esta extensión se comporta de forma diferente en Base de datos ilimitada de Aurora PostgreSQL y en la comunidad PostgreSQL. Para obtener más información, consulte Diferencias de pgstattuple en Base de datos ilimitada de Aurora PostgreSQL. -
pgvector
-
plpgsql
: esta extensión viene preinstalada, pero puede eliminarla. -
PostGIS
: no se admiten transacciones largas ni funciones de administración de tablas. No se admite la modificación de la tabla de referencia espacial. -
unaccent
-
uuid
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
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_statementspg_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 ] [ SCHEMAschema_name
] [ VERSIONversion
] [ 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 [ TOnew_version
] ALTER EXTENSIONname
SET SCHEMAnew_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
ADDmember_object
ALTER EXTENSIONname
DROPmember_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_buffercachepg_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 depg_buffercache
. -
relname
: en lugar de mostrar el número de nodo del archivo como enpg_buffercache
,limitless_pg_buffercache
presenta elrelname
asociado si está disponible en la base de datos actual o en los catálogos del sistema particionado; de lo contrario esNULL
. -
parent_relname
: esta nueva columna, que no está presente enpg_buffercache
, muestra la columna principalrelname
si el valor de la columnarelname
representa una tabla particionada (en el caso de las tablas particionadas). De lo contrario, se muestraNULL
. -
spcname
: en lugar de mostrar el identificador del objeto del espacio de tabla (OID) como enpg_buffercache
,limitless_pg_buffercache
muestra el nombre del espacio de tabla. -
datname
: en lugar de mostrar el OID de la base de datos como enpg_buffercache
,limitless_pg_buffercache
muestra el nombre de la base de datos. -
relforknumber
: permanece sin cambios por parte depg_buffercache
. -
relblocknumber
: permanece sin cambios por parte depg_buffercache
. -
isdirty
: permanece sin cambios por parte depg_buffercache
. -
usagecount
: permanece sin cambios por parte depg_buffercache
. -
pinning_backends
: permanece sin cambios por parte depg_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
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ónpgstatindex
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
conFOREIGN KEY
solo en tablas estándar. Para crear una tabla particionada o de referencia conFOREIGN 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 |
---|---|---|---|---|
|
Sí | Sí | Sí | Sí |
|
Sí | Sí | Sí | Sí |
|
Sí | Sí | Sí | Sí |
|
Sí | Sí | Sí | Sí |
|
No | No | No | No |
|
Sí | Sí | Sí | Sí |
|
Sí | Sí | Sí | Sí |
|
Sí | No | No | Sí |
|
Sí | Sí | Sí | Sí |
|
Sí | Sí | Sí | Sí |
|
Sí | Sí | Sí | Sí |
|
No | No | No | No |
|
Sí | No | No | Sí |
|
No | No | No | Sí |
|
Sí | Sí | Sí | Sí |
|
Sí | Sí | Sí | Sí |
|
No | No | No | No |
|
Sí | No | No | Sí |
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:
-
: es la función que se va a distribuir. Mencione solo los argumentos de entrada y ningún argumento de salida.function_prototype
Si alguno de los argumentos está definido como parámetro
OUT
, no incluya su tipo en los argumentos defunction_prototype
. -
ARRAY['
: es la lista de argumentos de la función que se identifica como la clave de partición de la función.shard_key
'] -
: es la tabla particionada que contiene el rango de datos de la partición de destino.collocating_table
Para identificar la partición en la que se debe presionar esta función para ejecutarla, el sistema toma el argumento ARRAY['
, lo convierte en un hash y busca la partición de shard_key
']
que aloja el rango que contiene este valor de hash.collocating_table
- 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 particionadacustomers
con la clave de particióncustomer_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
yOUT
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_procprovolatile
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 utilizarv
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
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
Temas
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ónpg_sequences
y la instrucciónSELECT * FROM
muestran solo el estado de la secuencia local, no el estado distribuido.sequence_name
-
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
, configurechunk_size
. (Cada enrutador tiene dos fragmentos). -
La opción
CACHE
es compatible, pero la memoria caché debe ser inferior achunk_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 Functionsen 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
ycache
tienen el mismo significado en la vista pg_sequencesy 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
yLWlock: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 denextval
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
yLWlock:bufferscontent
.Reduzca la configuración de la caché de secuencias.
La siguiente figura muestra los eventos de espera causados por problemas de secuencia.
