Limitazioni DDL e altre informazioni per Aurora PostgreSQL Limitless Database - Amazon Aurora

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Limitazioni DDL e altre informazioni per Aurora PostgreSQL Limitless Database

I seguenti argomenti descrivono le limitazioni o forniscono ulteriori informazioni per i comandi SQL DDL in Aurora PostgreSQL Limitless Database.

ALTER TABLE

Il ALTER TABLE comando è generalmente supportato in Aurora PostgreSQL Limitless Database. Per ulteriori informazioni, vedere ALTER TABLE nella documentazione di PostgreSQL.

Limitazioni

ALTER TABLEpresenta le seguenti limitazioni per le opzioni supportate.

Rimozione di una colonna
  • Nelle tabelle condivise, non è possibile rimuovere le colonne che fanno parte della chiave shard.

  • Nelle tabelle di riferimento, non è possibile rimuovere le colonne chiave primarie.

Modifica del tipo di dati di una colonna
  • L'USINGespressione non è supportata.

  • Nelle tabelle condivise, non è possibile modificare il tipo delle colonne che fanno parte della chiave shard.

Aggiungere o rimuovere un vincolo

Per informazioni dettagliate su ciò che non è supportato, consulta. Vincoli

Modifica del valore predefinito di una colonna

I valori predefiniti sono supportati. Per ulteriori informazioni, consulta Valori predefiniti.

Opzioni non supportate

Alcune opzioni non sono supportate perché dipendono da funzionalità non supportate, come i trigger.

Le seguenti opzioni a livello di tabella per ALTER TABLE non sono supportate:

  • ALL IN TABLESPACE

  • ATTACH PARTITION

  • DETACH PARTITION

  • ONLYcontrassegnare

  • RENAME CONSTRAINT

Le seguenti opzioni a livello di colonna per ALTER TABLE non sono supportate:

  • AGGIUNGI GENERATO

  • ELIMINA ESPRESSIONE [SE ESISTE]

  • DROP IDENTITY [SE ESISTE]

  • RESET

  • RESTART

  • SET

  • IMPOSTA LA COMPRESSIONE

  • SET STATISTICS

CREATE DATABASE

In Aurora PostgreSQL Limitless Database, sono supportati solo database illimitati.

Durante CREATE DATABASE l'esecuzione, i database che sono stati creati correttamente in uno o più nodi potrebbero non riuscire negli altri nodi, poiché la creazione del database è un'operazione non transazionale. In questo caso, gli oggetti del database che sono stati creati correttamente vengono rimossi automaticamente da tutti i nodi entro un periodo di tempo predeterminato per mantenere la coerenza nel gruppo di shard DB. Durante questo periodo, la ricreazione di un database con lo stesso nome potrebbe generare un errore che indica che il database esiste già.

Sono supportate le seguenti opzioni:

  • Collazione:

    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;

Le seguenti opzioni non sono supportate:

  • CREATE DATABASE WITH TABLESPACE:

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

    CREATE DATABASE name WITH TEMPLATE = template;

CREATE INDEX

CREATE INDEX CONCURRENTLYè supportato per le tabelle condivise:

CREATE INDEX CONCURRENTLY index_name ON table_name(column_name);

CREATE UNIQUE INDEXè supportato per tutti i tipi di tabella:

CREATE UNIQUE INDEX index_name ON table_name(column_name);

CREATE UNIQUE INDEX CONCURRENTLYnon è supportato:

CREATE UNIQUE INDEX CONCURRENTLY index_name ON table_name(column_name);

Per ulteriori informazioni, consulta UNIQUE. Per informazioni generali sulla creazione di indici, vedere CREATE INDEX nella documentazione di PostgreSQL.

Mostrare gli indici

Non tutti gli indici sono visibili sui router quando si utilizzano comandi simili. \d table_name Utilizzate invece la pg_catalog.pg_indexes vista per ottenere gli indici, come illustrato nell'esempio seguente.

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

CREATE SCHEMA

CREATE SCHEMAcon un elemento dello schema non è supportato:

CREATE SCHEMA my_schema CREATE TABLE (column_name INT);

Ciò genera un errore simile al seguente:

ERROR: CREATE SCHEMA with schema elements is not supported

CREATE TABLE

Le relazioni nelle CREATE TABLE istruzioni non sono supportate, ad esempio:

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

IDENTITYle colonne non sono supportate, ad esempio:

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

Aurora PostgreSQL Limitless Database supporta fino a 54 caratteri per i nomi di tabella condivisi.

CREATE TABLE AS

Per creare una tabella utilizzandoCREATE TABLE AS, è necessario utilizzare la variabile. rds_aurora.limitless_create_table_mode Per le tabelle condivise, è necessario utilizzare anche la rds_aurora.limitless_create_table_shard_key variabile. Per ulteriori informazioni, consulta Creazione di tabelle illimitate utilizzando variabili.

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

Non è possibile utilizzarla CREATE TABLE AS per creare tabelle di riferimento, poiché richiedono vincoli di chiave primaria. CREATE TABLE ASnon propaga le chiavi primarie a nuove tabelle.

Per informazioni generali, vedere CREATE TABLE AS nella documentazione di PostgreSQL.

DROP DATABASE

Puoi eliminare i database che hai creato.

Il DROP DATABASE comando viene eseguito in modo asincrono in background. Mentre è in esecuzione, riceverai un errore se provi a creare un nuovo database con lo stesso nome.

SELECT INTO

SELECT INTOè funzionalmente simile a. CREATE TABLE AS È necessario utilizzare la rds_aurora.limitless_create_table_mode variabile. Per le tabelle condivise, è necessario utilizzare anche la rds_aurora.limitless_create_table_shard_key variabile. Per ulteriori informazioni, consulta Creazione di tabelle illimitate utilizzando variabili.

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

Attualmente, l'SELECT INTOoperazione viene eseguita tramite il router, non direttamente tramite gli shard. Pertanto, le prestazioni possono essere lente.

Per informazioni generali, vedere SELECT INTO nella documentazione di PostgreSQL.

Vincoli

Le seguenti limitazioni si applicano ai vincoli in Aurora PostgreSQL Limitless Database.

CHECK

Sono supportati semplici vincoli che coinvolgono operatori di confronto con valori letterali. Le espressioni e i vincoli più complessi che richiedono la convalida delle funzioni non sono supportati, come illustrato negli esempi seguenti.

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

È possibile assegnare nomi espliciti ai vincoli, come illustrato nell'esempio seguente.

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

È possibile utilizzare la sintassi dei vincoli a livello di tabella con il vincolo, come illustrato nell'esempio seguenteCHECK.

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

I vincoli di esclusione non sono supportati in Aurora PostgreSQL Limitless Database.

FOREIGN KEY

Per ulteriori informazioni, consulta Chiavi esterne.

NON NULLO

NOT NULLi vincoli sono supportati senza restrizioni.

PRIMARY KEY

La chiave primaria implica vincoli univoci e pertanto le stesse restrizioni sui vincoli unici si applicano alla chiave primaria. Ciò significa:

  • Se una tabella viene convertita in una tabella condivisa, la chiave shard deve essere un sottoinsieme della chiave primaria. Cioè, la chiave primaria contiene tutte le colonne della chiave shard.

  • Se una tabella viene convertita in una tabella di riferimento, deve avere una chiave primaria.

Gli esempi seguenti illustrano l'uso delle chiavi primarie.

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

Sto cercando di aggiungere una chiave primaria che non contenga una chiave shard:

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

Cercando di aggiungere una chiave primaria che contenga una chiave shard:

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

Trasforma una tabella standard in una tabella di riferimento.

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

Per ulteriori informazioni sulla creazione di tabelle frammentate e di riferimento, vedereCreazione di tabelle del database Aurora SQL Postgre Limitless.

UNIQUE

Nelle tabelle suddivise, la chiave univoca deve contenere la chiave shard, ovvero la chiave shard deve essere un sottoinsieme della chiave univoca. Questo viene controllato quando si cambia il tipo di tabella in sharded. Nelle tabelle di riferimento non ci sono restrizioni.

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

I UNIQUE vincoli a livello di tabella sono supportati, come illustrato nell'esempio seguente.

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

L'esempio seguente mostra l'uso congiunto di una chiave primaria e di una chiave univoca. Entrambe le chiavi devono includere la chiave shard.

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

Per ulteriori informazioni, consulta Vincoli nella documentazione di PostgreSQL.

Valori predefiniti

Aurora PostgreSQL Limitless Database supporta espressioni con valori predefiniti.

L'esempio seguente mostra l'uso di valori predefiniti.

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)

Le espressioni sono supportate, come illustrato nell'esempio seguente.

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

L'esempio seguente aggiunge una nuova colonna che è NOT NULL e ha un valore predefinito.

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

L'esempio seguente modifica una colonna esistente con un valore predefinito.

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

L'esempio seguente elimina un valore predefinito.

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)

Per ulteriori informazioni, consulta Valori predefiniti nella documentazione di PostgreSQL.

Estensioni

Le seguenti estensioni PostgreSQL sono supportate in Aurora PostgreSQL Limitless Database:

La maggior parte delle estensioni PostgreSQL attualmente non è supportata in Aurora PostgreSQL Limitless Database. Tuttavia, puoi comunque utilizzare l'impostazione di configurazione shared_preload_libraries (SPL) per caricare le estensioni nel cluster DB primario Aurora PostgreSQL. Vengono inoltre caricati nel database Aurora PostgreSQL Limitless, ma potrebbero non funzionare correttamente.

Ad esempio, è possibile caricare l'pg_hint_planestensione, ma il suo caricamento non garantisce che vengano utilizzati i suggerimenti passati nei commenti delle query.

È possibile utilizzare le pg_available_extension_versions funzioni pg_available_extensions and per trovare le estensioni supportate in Aurora PostgreSQL Limitless Database.

Per le estensioni sono supportate le seguenti opzioni: DDLs

CREATE EXTENSION

È possibile creare estensioni, come in PostgreSQL.

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

Per ulteriori informazioni, consulta CREATE EXTENSION nella documentazione di PostgreSQL.

ALTER EXTENSION

Sono supportati: DDLs

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

Per ulteriori informazioni, vedere ALTER EXTENSION nella documentazione di PostgreSQL.

DROP EXTENSION

Puoi eliminare le estensioni, come in PostgreSQL.

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

Per ulteriori informazioni, consulta DROP EXTENSION nella documentazione di PostgreSQL.

Quanto segue DDLs non è supportato per le estensioni:

ALTER EXTENSION

Non puoi aggiungere o eliminare oggetti membri dalle estensioni.

ALTER EXTENSION name ADD member_object ALTER EXTENSION name DROP member_object

differenze pg_buffercache nel database Aurora PostgreSQL Limitless

In Aurora PostgreSQL Limitless Database, quando installi l'estensione pg_buffercache e utilizzi la pg_buffercache vista, ricevi informazioni relative al buffer solo dal nodo a cui sei attualmente connesso: il router. Analogamente, utilizza la funzione o fornisce informazioni solo dal nodo connesso. pg_buffercache_summary pg_buffercache_usage_counts

È possibile disporre di numerosi nodi e potrebbe essere necessario accedere alle informazioni sul buffer da qualsiasi nodo per diagnosticare i problemi in modo efficace. Pertanto, Limitless Database offre le seguenti funzioni:

  • rds_aurora.limitless_pg_buffercache(subcluster_id)

  • rds_aurora.limitless_pg_buffercache_summary(subcluster_id)

  • rds_aurora.limitless_pg_buffercache_usage_counts(subcluster_id)

Inserendo l'ID del sottocluster di qualsiasi nodo, che si tratti di un router o di uno shard, è possibile accedere facilmente alle informazioni sul buffer specifiche di quel nodo. Queste funzioni sono disponibili direttamente quando si installa l'pg_buffercacheestensione nel database illimitato.

Nota

Aurora PostgreSQL Limitless Database supporta queste funzioni per la versione 1.4 e successive dell'estensione. pg_buffercache

Le colonne mostrate nella limitless_pg_buffercache vista differiscono leggermente da quelle nella vista: pg_buffercache

  • bufferid— Rimane invariato dapg_buffercache.

  • relname— Invece di visualizzare il numero di nodo del file come in precedenzapg_buffercache, limitless_pg_buffercache presenta quello associato, relname se disponibile, nel database corrente o nei cataloghi del sistema condiviso, altrimenti. NULL

  • parent_relname— Questa nuova colonna, non presente inpg_buffercache, mostra il genitore relname se il valore nella relname colonna rappresenta una tabella partizionata (nel caso di tabelle condivise). Altrimenti, viene visualizzata. NULL

  • spcname— Invece di visualizzare l'identificatore dell'oggetto del tablespace (OID) come in precedenzapg_buffercache, limitless_pg_buffercache visualizza il nome del tablespace.

  • datname— Invece di visualizzare l'OID del database come in precedenzapg_buffercache, limitless_pg_buffercache visualizza il nome del database.

  • relforknumber— Rimane invariato dapg_buffercache.

  • relblocknumber— Rimane invariato da. pg_buffercache

  • isdirty— Rimane invariato da. pg_buffercache

  • usagecount— Rimane invariato da. pg_buffercache

  • pinning_backends— Rimane invariato da. pg_buffercache

Le colonne limitless_pg_buffercache_summary e le limitless_pg_buffercache_usage_counts viste sono uguali a quelle delle viste normali pg_buffercache_summary e delle pg_buffercache_usage_counts viste, rispettivamente.

Utilizzando queste funzioni, è possibile accedere a informazioni dettagliate sulla cache del buffer su tutti i nodi dell'ambiente Limitless Database, facilitando una diagnosi e una gestione più efficaci dei sistemi di database.

differenze pgstattuple nel database Aurora PostgreSQL Limitless

In Aurora PostgreSQL, l'estensione pgstattuple attualmente non supporta tabelle esterne, tabelle partizionate o indici partizionati. Tuttavia, in Aurora PostgreSQL Limitless Database, gli oggetti creati dall'utente sono spesso tra questi tipi non supportati. Sebbene esistano tabelle e indici normali (ad esempio, le tabelle di catalogo e i relativi indici), la maggior parte degli oggetti risiede su nodi esterni, il che li rende oggetti estranei al router.

Riconosciamo l'importanza di questa estensione per ottenere statistiche a livello di tuple, fondamentali per attività come la rimozione del bloat e la raccolta di informazioni diagnostiche. Pertanto, Aurora PostgreSQL Limitless Database fornisce supporto per l'estensione in database illimitati. pgstattuple

Il database Aurora PostgreSQL Limitless include le seguenti funzioni nello schema: rds_aurora

Funzioni statistiche a livello di tuple

rds_aurora.limitless_pgstattuple(relation_name)

  • Scopo: Estrarre statistiche a livello di tuple per tabelle standard e relativi indici

  • Input: relation_name (testo) — Il nome della relazione

  • Output: colonne coerenti con quelle restituite dalla pgstattuple funzione in Aurora PostgreSQL

rds_aurora.limitless_pgstattuple(relation_name, subcluster_id)

  • Scopo: Estrarre statistiche a livello di tuple per tabelle di riferimento, tabelle condivise, tabelle di catalogo e relativi indici

  • Input:

    • relation_name(testo) — Il nome della relazione

    • subcluster_id(testo) — L'ID del sottocluster del nodo in cui devono essere estratte le statistiche

  • Output:

    • Per le tabelle di riferimento e di catalogo (compresi i relativi indici), le colonne sono coerenti con quelle di Aurora PostgreSQL.

    • Per le tabelle suddivise, le statistiche rappresentano solo la partizione della tabella condivisa che risiede nel sottocluster specificato.

Funzioni di statistica dell'indice

rds_aurora.limitless_pgstatindex(relation_name)

  • Scopo: Estrarre le statistiche per gli indici B-tree su tabelle standard

  • Input: relation_name (testo) — Il nome dell'indice B-tree

  • Output: root_block_no vengono restituite tutte le colonne tranne. Le colonne restituite sono coerenti con la pgstatindex funzione di Aurora PostgreSQL.

rds_aurora.limitless_pgstatindex(relation_name, subcluster_id)

  • Scopo: Estrarre le statistiche per gli indici B-tree su tabelle di riferimento, tabelle ripartite e tabelle di catalogo.

  • Input:

    • relation_name(testo) — Il nome dell'indice B-tree

    • subcluster_id(testo) — L'ID del sottocluster del nodo in cui devono essere estratte le statistiche

  • Output:

    • Per gli indici delle tabelle di riferimento e del catalogo, vengono restituite tutte le colonne (tranneroot_block_no). Le colonne restituite sono coerenti con Aurora PostgreSQL.

    • Per le tabelle suddivise, le statistiche rappresentano solo la partizione dell'indice della tabella condivisa che risiede nel sottocluster specificato. La tree_level colonna mostra la media di tutte le sezioni di tabella del sottocluster richiesto.

rds_aurora.limitless_pgstatginindex(relation_name)

  • Scopo: Estrarre le statistiche per gli indici invertiti generalizzati () su tabelle standard GINs

  • Input: relation_name (testo) — Il nome del GIN

  • Output: colonne coerenti con quelle restituite dalla pgstatginindex funzione in Aurora PostgreSQL

rds_aurora.limitless_pgstatginindex(relation_name, subcluster_id)

  • Scopo: Estrarre le statistiche per gli indici GIN su tabelle di riferimento, tabelle condivise e tabelle di catalogo.

  • Input:

    • relation_name(testo) — Il nome dell'indice

    • subcluster_id(testo) — L'ID del sottocluster del nodo in cui devono essere estratte le statistiche

  • Output:

    • Per gli indici GIN delle tabelle di riferimento e di catalogo, le colonne sono coerenti con quelle di Aurora PostgreSQL.

    • Per le tabelle suddivise, le statistiche rappresentano solo la partizione dell'indice della tabella condivisa che risiede nel sottocluster specificato.

rds_aurora.limitless_pgstathashindex(relation_name)

  • Scopo: Estrarre le statistiche per gli indici hash su tabelle standard

  • Input: relation_name (text) — Il nome dell'indice hash

  • Output: colonne coerenti con quelle restituite dalla pgstathashindex funzione in Aurora PostgreSQL

rds_aurora.limitless_pgstathashindex(relation_name, subcluster_id)

  • Scopo: Estrarre le statistiche per gli indici hash su tabelle di riferimento, tabelle suddivise e tabelle di catalogo.

  • Input:

    • relation_name(testo) — Il nome dell'indice

    • subcluster_id(testo) — L'ID del sottocluster del nodo in cui devono essere estratte le statistiche

  • Output:

    • Per gli indici hash delle tabelle di riferimento e del catalogo, le colonne sono coerenti con Aurora PostgreSQL.

    • Per le tabelle suddivise, le statistiche rappresentano solo la partizione dell'indice della tabella condivisa che risiede nel sottocluster specificato.

Funzioni di conteggio delle pagine

rds_aurora.limitless_pg_relpages(relation_name)

  • Scopo: Estrarre il conteggio delle pagine per le tabelle standard e i relativi indici

  • Input: relation_name (testo) — Il nome della relazione

  • Output: numero di pagine della relazione specificata

rds_aurora.limitless_pg_relpages(relation_name, subcluster_id)

  • Scopo: estrae il conteggio delle pagine per le tabelle di riferimento, le tabelle suddivise e le tabelle del catalogo (compresi i relativi indici)

  • Input:

    • relation_name(testo) — Il nome della relazione

    • subcluster_id(testo) — L'ID del sottocluster del nodo in cui deve essere estratto il conteggio delle pagine

  • Output: per le tabelle suddivise, il conteggio delle pagine è la somma delle pagine di tutte le sezioni della tabella nel sottocluster specificato.

Funzioni statistiche approssimative a livello di tuple

rds_aurora.limitless_pgstattuple_approx(relation_name)

  • Scopo: Estrarre statistiche approssimative a livello di tuple per le tabelle standard e i relativi indici

  • Input: relation_name (testo) — Il nome della relazione

  • Output: colonne coerenti con quelle restituite dalla funzione pgstattuple_approx in Aurora PostgreSQL

rds_aurora.limitless_pgstattuple_approx(relation_name, subcluster_id)

  • Scopo: Estrarre statistiche approssimative a livello di tuple per tabelle di riferimento, tabelle suddivise e tabelle di catalogo (compresi i relativi indici)

  • Input:

    • relation_name(testo) — Il nome della relazione

    • subcluster_id(testo) — L'ID del sottocluster del nodo in cui devono essere estratte le statistiche

  • Output:

    • Per le tabelle di riferimento e di catalogo (compresi i relativi indici), le colonne sono coerenti con quelle di Aurora PostgreSQL.

    • Per le tabelle suddivise, le statistiche rappresentano solo la partizione della tabella condivisa che risiede nel sottocluster specificato.

Nota

Attualmente, Aurora PostgreSQL Limitless Database non supporta l'pgstattupleestensione su viste materializzate, tabelle TOAST o tabelle temporanee.

In Aurora PostgreSQL Limitless Database, è necessario fornire l'input come testo, sebbene Aurora PostgreSQL supporti altri formati.

Chiavi esterne

I vincoli Foreign key () sono supportati con alcune limitazioni: FOREIGN KEY

  • CREATE TABLEwith FOREIGN KEY è supportato solo per le tabelle standard. Per creare una tabella frammentata o di riferimento conFOREIGN KEY, create innanzitutto la tabella senza un vincolo di chiave esterna. Quindi modificatela utilizzando la seguente dichiarazione:

    ALTER TABLE ADD CONSTRAINT;
  • La conversione di una tabella standard in una tabella frammentata o di riferimento non è supportata quando la tabella ha un vincolo di chiave esterna. Eliminate il vincolo, quindi aggiungetelo dopo la conversione.

  • Le seguenti limitazioni si applicano ai tipi di tabella per i vincoli di chiave esterna:

    • Una tabella standard può avere un vincolo di chiave esterna rispetto a un'altra tabella standard.

    • Una tabella condivisa può avere un vincolo di chiave esterna se le tabelle principale e secondaria sono collocate e la chiave esterna è un superset della chiave shard.

    • Una tabella condivisa può avere un vincolo di chiave esterna rispetto a una tabella di riferimento.

    • Una tabella di riferimento può avere un vincolo di chiave esterna rispetto a un'altra tabella di riferimento.

Opzioni a chiave esterna

Le chiavi esterne sono supportate in Aurora PostgreSQL Limitless Database per alcune opzioni DDL. La tabella seguente elenca le opzioni supportate e non supportate tra le tabelle del database Aurora PostgreSQL Limitless.

Opzione DDL Riferimento al riferimento Da frammentato a frammentato (collocato) Suddiviso in base al riferimento Da standard a standard

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

Esempi

  • Da standard a standard:

    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)
  • Da suddiviso a frammentato (collocato):

    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);
  • Suddiviso in base al riferimento:

    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);
  • Riferimento al riferimento:

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

Funzioni

Le funzioni sono supportate in Aurora PostgreSQL Limitless Database.

Le seguenti DDLs funzioni sono supportate:

CREATE FUNCTION

È possibile creare funzioni, come in Aurora PostgreSQL, con l'eccezione di modificarne la volatilità sostituendole.

Per ulteriori informazioni, consultare CREATE FUNCTION nella documentazione di PostgreSQL.

ALTER FUNCTION

È possibile modificare le funzioni, come in Aurora PostgreSQL, ad eccezione della modifica della loro volatilità.

Per ulteriori informazioni, vedere ALTER FUNCTION nella documentazione di PostgreSQL.

DROP FUNCTION

È possibile eliminare le funzioni, come in Aurora PostgreSQL.

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

Per ulteriori informazioni, vedere DROP FUNCTION nella documentazione di PostgreSQL.

Distribuzione delle funzioni

Quando tutte le istruzioni di una funzione sono indirizzate a un singolo shard, è utile spostare l'intera funzione sullo shard di destinazione. Quindi il risultato viene propagato al router, anziché annullare la funzione sul router stesso. La funzionalità pushdown di funzioni e stored procedure è utile per i clienti che desiderano eseguire la propria funzione o la stored procedure più vicino alla fonte di dati, ovvero allo shard.

Per distribuire una funzione, è necessario innanzitutto creare la funzione, quindi chiamare la rds_aurora.limitless_distribute_function procedura per distribuirla. Questa funzione utilizza la seguente sintassi:

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

La funzione accetta i seguenti parametri:

  • function_prototype— La funzione da distribuire. Menziona solo gli argomenti di input e non nessuno degli argomenti di output.

    Se uno qualsiasi degli argomenti è definito come OUT parametro, non includete il loro tipo negli argomenti difunction_prototype.

  • ARRAY['shard_key']— L'elenco degli argomenti della funzione identificati come chiave shard per la funzione.

  • collocating_table— La tabella condivisa che contiene l'intervallo di dati sullo shard di destinazione.

Per identificare lo shard su cui attivare questa funzione per farla funzionare, il sistema prende l'ARRAY['shard_key']argomento, ne esegue l'hash e trova lo shard collocating_table che ospita l'intervallo contenente questo valore hash.

Restrizioni

Quando distribuite una funzione o una procedura, questa tratta solo i dati delimitati dall'intervallo di chiavi dello shard in quel frammento. Nei casi in cui la funzione o la procedura tenta di accedere ai dati da un altro shard, i risultati restituiti dalla funzione o dalla procedura distribuita saranno diversi rispetto a quelli non distribuiti.

Ad esempio, create una funzione contenente interrogazioni che toccheranno più shard, ma poi chiamate la rds_aurora.limitless_distribute_function procedura per distribuirla. Quando si richiama questa funzione fornendo argomenti per una chiave shard, è probabile che i risultati della sua esecuzione siano limitati dai valori presenti in tale shard. Questi risultati sono diversi da quelli prodotti senza distribuire la funzione.

Esempi

Consideriamo la seguente funzione func in cui abbiamo la tabella condivisa customers con il tasto shard. 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; $$;

Ora distribuiamo questa funzione:

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

Di seguito sono riportati alcuni esempi di piani di interrogazione.

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

L'esempio seguente mostra una procedura con OUT parametri IN e parametri come argomenti.

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

L'esempio seguente distribuisce la procedura utilizzando solo IN parametri.

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

Volatilità della funzione

Puoi determinare se una funzione è immutabile, stabile o volatile controllando il provolatile valore nella vista pg_proc. Il provolatile valore indica se il risultato della funzione dipende solo dai suoi argomenti di input o è influenzato da fattori esterni.

Il valore è uno dei seguenti:

  • i— Funzioni immutabili, che forniscono sempre lo stesso risultato per gli stessi input

  • s— Funzioni stabili, i cui risultati (per input fissi) non cambiano durante una scansione

  • v— Funzioni volatili, i cui risultati potrebbero cambiare in qualsiasi momento. Utilizzatele anche v per funzioni con effetti collaterali, in modo che le chiamate ad esse non possano essere ottimizzate.

Gli esempi seguenti mostrano le funzioni volatili.

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

La modifica della volatilità di una funzione esistente non è supportata in Aurora PostgreSQL Limitless Database. Questo vale sia per i comandi che per ALTER FUNCTION i CREATE OR REPLACE FUNCTION comandi, come illustrato negli esempi seguenti.

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

Consigliamo vivamente di assegnare le volatilità corrette alle funzioni. Ad esempio, se la funzione utilizza SELECT più tabelle o fa riferimento a oggetti del database, non impostarla come. IMMUTABLE Se il contenuto della tabella cambia, l'immutabilità viene interrotta.

Aurora PostgreSQL consente funzioni SELECT interne immutabili, ma i risultati potrebbero essere errati. Aurora PostgreSQL Limitless Database può restituire sia errori che risultati errati. Per ulteriori informazioni sulla volatilità delle funzioni, consulta Categorie di volatilità delle funzioni nella documentazione di PostgreSQL.

Sequenze

Le sequenze denominate sono oggetti di database che generano numeri univoci in ordine crescente o decrescente. CREATE SEQUENCEcrea un nuovo generatore di numeri di sequenza. È garantito che i valori di sequenza siano unici.

Quando si crea una sequenza denominata in Aurora PostgreSQL Limitless Database, viene creato un oggetto sequenza distribuito. Quindi Aurora PostgreSQL Limitless Database distribuisce blocchi di valori di sequenza non sovrapposti su tutti i Distributed Transaction Router (router). I blocchi sono rappresentati come oggetti di sequenza locale sui router; pertanto, le operazioni di sequenza come e vengono eseguite localmente. nextval currval I router funzionano in modo indipendente e richiedono nuovi blocchi dalla sequenza distribuita quando necessario.

Per ulteriori informazioni sulle sequenze, vedere CREATE SEQUENCE nella documentazione di PostgreSQL.

Richiedere un nuovo blocco

È possibile configurare le dimensioni dei blocchi allocati sui router utilizzando il parametro. rds_aurora.limitless_sequence_chunk_size Il valore predefinito è 250000. Inizialmente ogni router possiede due blocchi: attivi e riservati. I blocchi attivi vengono utilizzati per configurare gli oggetti della sequenza locale (impostazione minvalue emaxvalue) e i blocchi riservati vengono archiviati in una tabella interna del catalogo. Quando un blocco attivo raggiunge il valore minimo o massimo, viene sostituito dal blocco riservato. Per fare ciò, ALTER SEQUENCE viene utilizzato internamente, il che significa che AccessExclusiveLock viene acquisito.

I background worker vengono eseguiti ogni 10 secondi sui nodi del router per scansionare le sequenze alla ricerca di blocchi riservati utilizzati. Se viene trovato un blocco usato, il lavoratore richiede un nuovo blocco dalla sequenza distribuita. Assicurati di impostare la dimensione del blocco sufficientemente grande da consentire ai lavoratori in background di avere abbastanza tempo per richiederne di nuovi. Le richieste remote non avvengono mai nel contesto delle sessioni utente, il che significa che non è possibile richiedere direttamente una nuova sequenza.

Limitazioni

Le seguenti limitazioni si applicano alle sequenze in Aurora PostgreSQL Limitless Database:

  • Il pg_sequence catalogo, la pg_sequences funzione e l'SELECT * FROM sequence_nameistruzione mostrano tutti solo lo stato della sequenza locale, non lo stato distribuito.

  • È garantito che i valori di sequenza siano unici e monotoni all'interno di una sessione. Tuttavia, possono non funzionare correttamente se le nextval istruzioni vengono eseguite in altre sessioni, se tali sessioni sono connesse ad altri router.

  • Assicurati che la dimensione della sequenza (numero di valori disponibili) sia sufficientemente grande da poter essere distribuita su tutti i router. Utilizzate il rds_aurora.limitless_sequence_chunk_size parametro per configurare. chunk_size (Ogni router ha due blocchi).

  • L'CACHEopzione è supportata, ma la cache deve essere più piccola di. chunk_size

Opzioni non supportate

Le seguenti opzioni non sono supportate per le sequenze in Aurora PostgreSQL Limitless Database.

Funzioni di manipolazione di sequenze

La funzione non è supportata. setval Per ulteriori informazioni, consulta Funzioni di manipolazione delle sequenze nella documentazione di PostgreSQL.

CREATE SEQUENCE

Le seguenti opzioni non sono supportate.

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

Per ulteriori informazioni, vedere CREATE SEQUENCE nella documentazione di PostgreSQL.

ALTERARE LA SEQUENZA

Le seguenti opzioni non sono supportate.

ALTER SEQUENCE [[ NO ] CYCLE]

Per ulteriori informazioni, vedere ALTER SEQUENCE nella documentazione di PostgreSQL.

ALTER TABLE

Il ALTER TABLE comando non è supportato per le sequenze.

Esempi

CREA/RILASCIA UNA SEQUENZA
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
ALTERARE LA SEQUENZA
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)
Funzioni di manipolazione di sequenze
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)

viste in sequenza

Aurora PostgreSQL Limitless Database offre le seguenti viste per le sequenze.

rds_aurora.limitless_distributed_sequence

Questa vista mostra lo stato e la configurazione della sequenza distribuiti. Le cache colonne minvaluemaxvalue,start,inc, e hanno lo stesso significato della vista pg_sequences e mostrano le opzioni con cui è stata creata la sequenza. La lastval colonna mostra l'ultimo valore allocato o riservato in un oggetto di sequenza distribuito. Ciò non significa che il valore sia già stato utilizzato, poiché i router mantengono localmente i blocchi di sequenza.

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

Questa vista mostra i metadati di sequenza distribuiti e aggrega i metadati di sequenza dai nodi del cluster. Utilizza le seguenti colonne:

  • subcluster_id— L'ID del nodo del cluster che possiede un blocco.

  • Blocco attivo: un blocco di una sequenza che viene utilizzato (active_minvalue,). active_maxvalue

  • Chunk riservato: il blocco locale che verrà utilizzato successivamente (,). reserved_minvalue reserved_maxvalue

  • local_last_value— L'ultimo valore osservato da una sequenza locale.

  • chunk_size— La dimensione di un blocco, come configurato al momento della creazione.

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)

Risoluzione dei problemi relativi alla sequenza

I seguenti problemi possono verificarsi con le sequenze.

La dimensione del blocco non è sufficientemente grande

Se la dimensione del blocco non è sufficientemente grande e il tasso di transazione è elevato, i lavoratori in background potrebbero non avere abbastanza tempo per richiedere nuovi blocchi prima che i blocchi attivi siano esauriti. Ciò può portare a situazioni di contesa e attesa come,, e. LIMITLESS:AuroraLimitlessSequenceReplace LWLock:LockManager Lockrelation LWlock:bufferscontent

Incrementa il valore del parametro rds_aurora.limitless_sequence_chunk_size.

La cache delle sequenze è troppo alta

In PostgreSQL, la memorizzazione nella cache delle sequenze avviene a livello di sessione. Ogni sessione assegna valori di sequenza successivi durante un accesso all'oggetto sequenza e aumenta di conseguenza quelli dell'oggetto sequenza. last_value Quindi, gli usi nextval successivi di quella sessione restituiscono semplicemente i valori preallocati senza toccare l'oggetto della sequenza.

Tutti i numeri assegnati ma non utilizzati all'interno di una sessione vengono persi al termine di tale sessione, con conseguenti «buchi» nella sequenza. Ciò può consumare rapidamente sequence_chunk e portare a eventi di contesa e attesa come,, e. LIMITLESS:AuroraLimitlessSequenceReplace LWLock:LockManager Lockrelation LWlock:bufferscontent

Riduci l'impostazione della cache della sequenza.

La figura seguente mostra gli eventi di attesa causati da problemi di sequenza.

Eventi di attesa causati da problemi di sequenza.