DDL-Einschränkungen und andere Informationen für Aurora PostgreSQL Limitless Database - Amazon Aurora

DDL-Einschränkungen und andere Informationen für Aurora PostgreSQL Limitless Database

In den folgenden Themen werden Einschränkungen beschrieben oder weitere Informationen zu DDL-SQL-Befehlen in Aurora PostgreSQL Limitless Database bereitgestellt.

ALTER TABLE

Der Befehl ALTER TABLE wird in Aurora PostgreSQL Limitless Database in der Regel unterstützt. Weitere Informationen finden Sie im Abschnitt ALTER TABLE der PostgreSQL-Dokumentation.

Einschränkungen

ALTER TABLE weist die folgenden Einschränkungen für unterstützte Optionen auf.

Entfernen einer Spalte
  • In Sharded-Tabellen können Sie keine Spalten entfernen, die Teil des Shard-Schlüssels sind.

  • In Referenztabellen können Sie keine Primärschlüsselspalten entfernen.

Ändern des Datentyps einer Spalte
  • Der Ausdruck USING wird nicht unterstützt.

  • In Sharded-Tabellen können Sie den Datentyp von Spalten nicht ändern, die Teil des Shard-Schlüssels sind.

Hinzufügen oder Entfernen einer Beschränkung

Einzelheiten darüber, was nicht unterstützt wird, finden Sie unter Beschränkungen.

Ändern des Standardwerts einer Spalte

Standardwerte werden unterstützt. Weitere Informationen finden Sie unter Standardwerte.

Nicht unterstützte Optionen

Einige Optionen werden nicht unterstützt, da sie von nicht unterstützten Features wie Auslösern abhängen.

Die folgenden Optionen auf Tabellenebene für ALTER TABLE werden nicht unterstützt:

  • ALL IN TABLESPACE

  • ATTACH PARTITION

  • DETACH PARTITION

  • ONLY-Flag

  • RENAME CONSTRAINT

Die folgenden Optionen auf Spaltenebene für ALTER TABLE werden nicht unterstützt:

  • ADD GENERATED

  • DROP EXPRESSION [IF EXISTS]

  • DROP IDENTITY [IF EXISTS]

  • RESET

  • RESTART

  • SET

  • SET COMPRESSION

  • SET STATISTICS

CREATE DATABASE

In Aurora PostgreSQL Limitless Database werden nur uneingeschränkte Datenbanken unterstützt.

Während CREATE DATABASE ausgeführt wird, schlagen Datenbanken, die in einem oder mehreren Knoten erfolgreich erstellt wurden, möglicherweise in anderen Knoten fehl, da eine Datenbankerstellung ein nicht-transaktionaler Vorgang ist. In diesem Fall werden Datenbankobjekte, die erfolgreich erstellt wurden, innerhalb eines vordefinierten Zeitraums automatisch von allen Knoten entfernt, damit in der DB-Shard-Gruppe die Konsistenz erhalten bleibt. In diesem Zeitraum kann die Neuerstellung einer Datenbank mit demselben Namen zu einem Fehler führen, der darauf hinweist, dass die Datenbank bereits existiert.

Die folgenden Optionen werden unterstützt:

  • Kollation:

    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;

Die folgenden Optionen werden nicht unterstützt:

  • 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 wird für Sharded-Tabellen unterstützt:

CREATE INDEX CONCURRENTLY index_name ON table_name(column_name);

CREATE UNIQUE INDEX wird für alle Tabellentypen unterstützt:

CREATE UNIQUE INDEX index_name ON table_name(column_name);

CREATE UNIQUE INDEX CONCURRENTLY wird nicht unterstützt:

CREATE UNIQUE INDEX CONCURRENTLY index_name ON table_name(column_name);

Weitere Informationen finden Sie unter UNIQUE. Allgemeine Informationen zum Erstellen von Indizes finden Sie im Abschnitt CREATE INDEX der PostgreSQL-Dokumentation.

Anzeigen von Indizes

Nicht alle Indizes sind auf Routern sichtbar, wenn Sie \d table_name oder ähnliche Befehle verwenden. Verwenden Sie stattdessen die Ansicht pg_catalog.pg_indexes, um Indizes abzurufen, wie im folgenden Beispiel gezeigt.

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 SCHEMA mit einem Schemaelement wird nicht unterstützt:

CREATE SCHEMA my_schema CREATE TABLE (column_name INT);

Es tritt ein Fehler auf, der in etwa folgendermaßen aussieht:

ERROR: CREATE SCHEMA with schema elements is not supported

CREATE TABLE

Beziehungen in CREATE TABLE-Anweisungen werden nicht unterstützt, zum Beispiel:

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

IDENTITY-Spalten werden nicht unterstützt, zum Beispiel:

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

Aurora PostgreSQL Limitless Database unterstützt bis zu 54 Zeichen für Namen von Sharded-Tabellen.

CREATE TABLE AS

Wenn Sie eine Tabelle mit CREATE TABLE AS erstellen möchten, müssen Sie die Variable rds_aurora.limitless_create_table_mode verwenden. Für Sharded-Tabellen müssen Sie außerdem die Variable rds_aurora.limitless_create_table_shard_key verwenden. Weitere Informationen finden Sie unter Erstellen von Limitless-Tabellen mithilfe von Variablen.

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

Sie können CREATE TABLE AS nicht zum Erstellen von Referenztabellen verwenden, da sie Primärschlüsselbeschränkungen erfordern. CREATE TABLE AS propagiert Primärschlüssel nicht an neue Tabellen.

Allgemeine Informationen finden Sie im Abschnitt CREATE TABLE AS der PostgreSQL-Dokumentation.

DROP DATABASE

Sie können Datenbanken, die Sie erstellt haben, löschen.

Der Befehl DROP DATABASE wird asynchron im Hintergrund ausgeführt. Während der Ausführung erhalten Sie eine Fehlermeldung, wenn Sie versuchen, eine neue Datenbank mit demselben Namen zu erstellen.

SELECT INTO

SELECT INTO funktioniert ähnlich wie CREATE TABLE AS. Sie müssen die Variable rds_aurora.limitless_create_table_mode verwenden. Für Sharded-Tabellen müssen Sie außerdem die Variable rds_aurora.limitless_create_table_shard_key verwenden. Weitere Informationen finden Sie unter Erstellen von Limitless-Tabellen mithilfe von Variablen.

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

Derzeit wird der Vorgang SELECT INTO über den Router ausgeführt, nicht direkt über die Shards. Dies kann die Leistung beeinträchtigen.

Weitere Informationen dazu finden Sie im Abschnitt SELECT INTO der PostgreSQL-Dokumentation.

Beschränkungen

Die folgenden Einschränkungen gelten für Beschränkungen in Aurora PostgreSQL Limitless Database.

CHECK

Einfache Beschränkungen, die Vergleichsoperatoren mit Literalen beinhalten, werden unterstützt. Komplexere Ausdrücke und Beschränkungen, die Funktionsvalidierungen erfordern, werden nicht unterstützt, wie in den folgenden Beispielen gezeigt.

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

Sie können Beschränkungen explizite Namen geben, wie im folgenden Beispiel gezeigt.

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

Sie können die Beschränkungssyntax auf Tabellenebene mit der Beschränkung CHECK verwenden, wie im folgenden Beispiel gezeigt.

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

Ausschlussbeschränkungen werden in Aurora PostgreSQL Limitless Database nicht unterstützt.

FOREIGN KEY

Weitere Informationen finden Sie unter Fremdschlüssel.

NOT NULL

NOT NULL-Beschränkungen werden uneingeschränkt unterstützt.

PRIMARY KEY

Der Primärschlüssel impliziert eindeutige Beschränkungen, weshalb die Einschränkungen für eindeutige Beschränkungen auch für den Primärschlüssel gelten. Das bedeutet Folgendes:

  • Wenn eine Tabelle in eine Sharded-Tabelle konvertiert wird, muss der Shard-Schlüssel eine Teilmenge des Primärschlüssels sein. Das heißt, der Primärschlüssel enthält alle Spalten des Shard-Schlüssels.

  • Wenn eine Tabelle in eine Referenztabelle konvertiert wird, muss sie einen Primärschlüssel haben.

Die folgenden Beispiele veranschaulichen die Verwendung von Primärschlüsseln.

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

Hier wird versucht, einen Primärschlüssel hinzuzufügen, der keinen Shard-Schlüssel enthält:

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

Hier wird versucht, einen Primärschlüssel hinzuzufügen, der einen Shard-Schlüssel enthält:

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

In diesem Beispiel wird eine Standardtabelle in eine Referenztabelle konvertiert:

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

Weitere Informationen zum Erstellen von Sharded-Tabellen und Referenztabellen finden Sie unter Erstellen von Tabellen in Aurora PostgreSQL Limitless Database.

UNIQUE

In Sharded-Tabellen muss der eindeutige Schlüssel den Shard-Schlüssel enthalten, das heißt, der Shard-Schlüssel muss eine Teilmenge des eindeutigen Schlüssels sein. Dies wird überprüft, wenn der Tabellentyp in „Sharded“ geändert wird. In Referenztabellen gibt es keine Einschränkung.

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

UNIQUE-Beschränkungen auf Tabellenebene werden unterstützt, wie im folgenden Beispiel gezeigt.

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

Das folgende Beispiel zeigt die gemeinsame Verwendung eines Primärschlüssels und eines eindeutigen Schlüssels. Beide Schlüssel müssen den Shard-Schlüssel enthalten.

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

Weitere Informationen finden Sie im Abschnitt Beschränkungen der PostgreSQL-Dokumentation.

Standardwerte

Aurora PostgreSQL Limitless Database unterstützt Ausdrücke in Standardwerten.

Das folgende Beispiel veranschaulicht die Verwendung von Standardwerten.

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)

Ausdrücke werden unterstützt, wie im folgenden Beispiel gezeigt.

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

Im folgenden Beispiel wird eine neue Spalte hinzugefügt, die NOT NULL ist und einen Standardwert hat.

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

Im folgenden Beispiel wird eine vorhandene Spalte geändert und ein Standardwert hinzugefügt.

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)

Im folgenden Beispiel wird ein Standardwert entfernt.

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)

Weitere Informationen finden Sie im Abschnitt Standardwerte der PostgreSQL-Dokumentation.

Erweiterungen

Die folgenden PostgreSQL-Erweiterungen werden in Aurora PostgreSQL Limitless Database unterstützt:

  • aurora_limitless_fdw: Diese Erweiterung ist vorinstalliert. Sie können sie nicht löschen.

  • aws_s3: Diese Erweiterung funktioniert in Aurora PostgreSQL Limitless Database ähnlich wie in Aurora PostgreSQL.

    Sie können Daten aus einem Amazon-S3-Bucket in den DB-Cluster einer Aurora PostgreSQL Limitless Database importieren oder Daten aus dem DB-Cluster einer Aurora PostgreSQL Limitless Database in einen Amazon-S3-Bucket exportieren. Weitere Informationen erhalten Sie unter Importieren von Amazon S3 in einen Aurora-PostgreSQL-DB-Cluster und Exportieren von Daten aus einem/einer Aurora PostgreSQL-DB-Cluster zu Amazon S3.

  • btree_gin

  • citext

  • ip4r

  • pg_buffercache: Diese Erweiterung verhält sich in Aurora PostgreSQL Limitless Database anders als in der PostgreSQL-Community. Weitere Informationen finden Sie unter pg_buffercache-Unterschiede in Aurora PostgreSQL Limitless Database.

  • pg_stat_statements

  • pg_trgm

  • pgcrypto

  • pgstattuple: Diese Erweiterung verhält sich in Aurora PostgreSQL Limitless Database anders als in der PostgreSQL-Community. Weitere Informationen finden Sie unter pgstattuple-Unterschiede in Aurora PostgreSQL Limitless Database.

  • pgvector

  • plpgsql: Diese Erweiterung ist vorinstalliert, aber Sie können sie löschen.

  • PostGIS: Lange Transaktionen und Tabellenverwaltungsfunktionen werden nicht unterstützt. Die Geo-Referenztabelle lässt sich nicht ändern.

  • unaccent

  • uuid

Die meisten PostgreSQL-Erweiterungen werden in Aurora PostgreSQL Limitless Database derzeit nicht unterstützt. Sie können jedoch weiterhin die Konfigurationseinstellung shared_preload_libraries (SPL) verwenden, um Erweiterungen in den Cluster der primären Aurora PostgreSQL-Datenbank zu laden. Sie werden auch in die Aurora PostgreSQL Limitless Database geladen, funktionieren dort aber möglicherweise nicht richtig.

So können Sie beispielsweise die Erweiterung pg_hint_plan zwar laden, es bleibt aber ungewiss, ob die in den Abfragekommentaren übergebenen Hinweise verwendet werden.

Anmerkung

Sie können keine Objekte ändern, die der Erweiterung pg_stat_statements zugeordnet sind. Informationen zur Installation von pg_stat_statements finden Sie unter limitless_stat_statements.

Sie können die Funktionen pg_available_extensions und pg_available_extension_versions verwenden, um die Erweiterungen zu finden, die in Aurora PostgreSQL Limitless Database unterstützt werden.

Die folgenden DDLs werden für Erweiterungen unterstützt:

CREATE EXTENSION

Sie können Erweiterungen wie in PostgreSQL erstellen.

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

Weitere Informationen finden Sie im Abschnitt CREATE EXTENSION der PostgreSQL-Dokumentation.

ALTER EXTENSION

Die folgenden DDLs werden unterstützt:

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

Weitere Informationen finden Sie im Abschnitt ALTER EXTENSION der PostgreSQL-Dokumentation.

DROP EXTENSION

Sie können Erweiterungen wie in PostgreSQL löschen.

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

Weitere Informationen finden Sie im Abschnitt DROP EXTENSION der PostgreSQL-Dokumentation.

Die folgenden DDLs werden für Erweiterungen nicht unterstützt:

ALTER EXTENSION

Sie können keine Mitgliedsobjekte zu Erweiterungen hinzufügen oder daraus löschen.

ALTER EXTENSION name ADD member_object ALTER EXTENSION name DROP member_object

pg_buffercache-Unterschiede in Aurora PostgreSQL Limitless Database

Wenn Sie in Aurora PostgreSQL Limitless Database die Erweiterung pg_buffercache installieren und die Ansicht pg_buffercache verwenden, erhalten Sie pufferbezogene Informationen nur von dem Knoten, mit dem Sie gerade verbunden sind: dem Router. Ähnlich erhalten Sie bei Verwendung der Funktion pg_buffercache_summary oder pg_buffercache_usage_counts nur Informationen vom verbundenen Knoten.

Sie können über zahlreiche Knoten verfügen und müssen möglicherweise für jeden Knoten einzeln auf Pufferinformationen zugreifen, um Probleme effektiv zu diagnostizieren. Daher stellt Limitless Database die folgenden Funktionen bereit:

  • rds_aurora.limitless_pg_buffercache(subcluster_id)

  • rds_aurora.limitless_pg_buffercache_summary(subcluster_id)

  • rds_aurora.limitless_pg_buffercache_usage_counts(subcluster_id)

Durch Eingabe der Subcluster-ID eines beliebigen Knotens, unabhängig davon, ob es sich um einen Router oder einen Shard handelt, können Sie einfach auf die für diesen Knoten spezifischen Pufferinformationen zugreifen. Diese Funktionen sind direkt verfügbar, wenn Sie die Erweiterung pg_buffercache in Limitless Database installieren.

Anmerkung

Aurora PostgreSQL Limitless Database unterstützt diese Funktionen für Version 1.4 und höher der Erweiterung pg_buffercache.

Die in der Ansicht limitless_pg_buffercache angezeigten Spalten unterscheiden sich geringfügig von denen in der Ansicht pg_buffercache:

  • bufferid: bleibt unverändert gegenüber pg_buffercache

  • relname: Anstatt wie in pg_buffercache die Dateiknotennummer anzuzeigen, bildet limitless_pg_buffercache den zugehörigen relname ab, sofern dieser Name in der aktuellen Datenbank oder in gemeinsam genutzten Systemkatalogen verfügbar ist. Andernfalls wird NULL angezeigt.

  • parent_relname: In dieser neuen Spalte, die in pg_buffercache nicht vorhanden ist, wird der übergeordnete relname angezeigt, wenn der Wert in der Spalte relname eine partitionierte Tabelle darstellt (im Fall von Sharded-Tabellen). Andernfalls wird NULL angezeigt.

  • spcname: Anstatt wie in pg_buffercache den Tablespace-Objektbezeichner (OID) anzuzeigen, bildet limitless_pg_buffercache den Tablespace-Namen ab.

  • datname: Anstatt wie in pg_buffercache die Datenbank-OID anzuzeigen, bildet limitless_pg_buffercache den Datenbanknamen ab.

  • relforknumber: bleibt unverändert gegenüber pg_buffercache

  • relblocknumber: bleibt unverändert gegenüber pg_buffercache

  • isdirty: bleibt unverändert gegenüber pg_buffercache

  • usagecount: bleibt unverändert gegenüber pg_buffercache

  • pinning_backends: bleibt unverändert gegenüber pg_buffercache

Die Spalten in den Ansichten limitless_pg_buffercache_summary und limitless_pg_buffercache_usage_counts sind dieselben wie in den regulären Ansichten pg_buffercache_summary und pg_buffercache_usage_counts.

Mithilfe dieser Funktionen können Sie auf detaillierte Informationen zum Puffercache aller Knoten in Ihrer Limitless-Database-Umgebung zugreifen und so eine effektivere Diagnose und Verwaltung Ihrer Datenbanksysteme ermöglichen.

pgstattuple-Unterschiede in Aurora PostgreSQL Limitless Database

In Aurora PostgreSQL unterstützt die Erweiterung pgstattuple derzeit keine Fremdtabellen, partitionierten Tabellen oder partitionierten Indizes. In Aurora PostgreSQL Limitless Database gehören jedoch häufig von Benutzern erstellte Objekte zu diesen nicht unterstützten Typen. Zwar gibt es reguläre Tabellen und Indizes (z. B. Katalogtabellen und ihre Indizes), aber die meisten Objekte befinden sich auf fremden Knoten, was sie zu Fremdobjekten für den Router macht.

Wir wissen, wie wichtig diese Erweiterung für das Abrufen von Statistiken auf Tupel-Ebene ist – eine wichtige Voraussetzung, um Tabellen- und Indexüberlastungen vermeiden und Diagnoseinformationen erfassen zu können. Daher unterstützt Aurora PostgreSQL Limitless Database die Erweiterung pgstattuple in unbegrenzten Datenbanken.

Aurora PostgreSQL Limitless Database enthält die folgenden Funktionen im Schema rds_aurora:

Funktionen für Statistiken auf Tupel-Ebene

rds_aurora.limitless_pgstattuple(relation_name)

  • Zweck: Statistiken auf Tupel-Ebene für Standardtabellen und deren Indizes extrahieren

  • Eingabe: relation_name (Text): der Beziehungsname

  • Ausgabe: Spalten, die mit denen übereinstimmen, die von der Funktion pgstattuple in Aurora PostgreSQL zurückgegeben werden

rds_aurora.limitless_pgstattuple(relation_name, subcluster_id)

  • Zweck: Statistiken auf Tupel-Ebene für Referenztabellen, Sharded-Tabellen, Katalogtabellen und deren Indizes extrahieren

  • Eingabe:

    • relation_name (Text): der Beziehungsname

    • subcluster_id (Text): die Subcluster-ID des Knotens, auf dem die Statistiken extrahiert werden sollen

  • Ausgabe:

    • Bei Referenz- und Katalogtabellen (einschließlich ihrer Indizes) stimmen die Spalten mit denen in Aurora PostgreSQL überein.

    • Bei Sharded-Tabellen stellen die Statistiken nur die Partition der Tabelle dar, die sich auf dem angegebenen Subcluster befindet.

Funktionen für Indexstatistiken

rds_aurora.limitless_pgstatindex(relation_name)

  • Zweck: Statistiken für B-Baum-Indizes von Standardtabellen extrahieren

  • Eingabe: relation_name (Text): der Name des B-Baum-Indexes

  • Ausgabe: Alle Spalten außer root_block_no werden zurückgegeben. Die zurückgegebenen Spalten stimmen mit denen überein, die die Funktion pgstatindex in Aurora PostgreSQL liefert.

rds_aurora.limitless_pgstatindex(relation_name, subcluster_id)

  • Zweck: Statistiken für B-Baum-Indizes von Referenz-, Sharded- und Katalogtabellen extrahieren

  • Eingabe:

    • relation_name (Text): der Name des B-Baum-Indexes

    • subcluster_id (Text): die Subcluster-ID des Knotens, auf dem die Statistiken extrahiert werden sollen

  • Ausgabe:

    • Bei Indizes von Referenz- und Katalogtabellen werden alle Spalten (außer root_block_no) zurückgegeben. Die zurückgegebenen Spalten stimmen mit denen in Aurora PostgreSQL überein.

    • Bei Sharded-Tabellen stellen die Statistiken nur die Partition des Indexes der Tabelle dar, die sich auf dem angegebenen Subcluster befindet. Die Spalte tree_level zeigt den Durchschnitt aller Tabellenausschnitte im angeforderten Subcluster.

rds_aurora.limitless_pgstatginindex(relation_name)

  • Zweck: Statistiken für GINs (Generalized Inverted Indexes) von Standardtabellen extrahieren

  • Eingabe: relation_name (Text): der Name des GIN

  • Ausgabe: Spalten, die mit denen übereinstimmen, die von der Funktion pgstatginindex in Aurora PostgreSQL zurückgegeben werden

rds_aurora.limitless_pgstatginindex(relation_name, subcluster_id)

  • Zweck: Statistiken für GINs von Referenz-, Sharded- und Katalogtabellen extrahieren

  • Eingabe:

    • relation_name (Text): der Name des Indexes

    • subcluster_id (Text): die Subcluster-ID des Knotens, auf dem die Statistiken extrahiert werden sollen

  • Ausgabe:

    • Bei GINs von Referenz- und Katalogtabellen stimmen die Spalten mit denen in Aurora PostgreSQL überein.

    • Bei Sharded-Tabellen stellen die Statistiken nur die Partition des Indexes der Tabelle dar, die sich auf dem angegebenen Subcluster befindet.

rds_aurora.limitless_pgstathashindex(relation_name)

  • Zweck: Statistiken für Hash-Indizes von Standardtabellen extrahieren

  • Eingabe: relation_name (Text): der Name des Hash-Indexes

  • Ausgabe: Spalten, die mit denen übereinstimmen, die von der Funktion pgstathashindex in Aurora PostgreSQL zurückgegeben werden

rds_aurora.limitless_pgstathashindex(relation_name, subcluster_id)

  • Zweck: Statistiken für Hash-Indizes von Referenz-, Sharded- und Katalogtabellen extrahieren

  • Eingabe:

    • relation_name (Text): der Name des Indexes

    • subcluster_id (Text): die Subcluster-ID des Knotens, auf dem die Statistiken extrahiert werden sollen

  • Ausgabe:

    • Bei Hash-Indizes von Referenz- und Katalogtabellen stimmen die Spalten mit denen in Aurora PostgreSQL überein.

    • Bei Sharded-Tabellen stellen die Statistiken nur die Partition des Indexes der Tabelle dar, die sich auf dem angegebenen Subcluster befindet.

Funktionen zur Seitenanzahl

rds_aurora.limitless_pg_relpages(relation_name)

  • Zweck: die Seitenanzahl für Standardtabellen und deren Indizes extrahieren

  • Eingabe: relation_name (Text): der Beziehungsname

  • Ausgabe: die Seitenanzahl der angegebenen Beziehung

rds_aurora.limitless_pg_relpages(relation_name, subcluster_id)

  • Zweck: die Seitenanzahl für Referenz-, Sharded- und Katalogtabellen (einschließlich ihrer Indizes) extrahieren

  • Eingabe:

    • relation_name (Text): der Beziehungsname

    • subcluster_id (Text): die Subcluster-ID des Knotens, auf dem die Seitenanzahl extrahiert werden soll

  • Ausgabe: Bei Sharded-Tabellen entspricht die Seitenanzahl der Summe der Seiten aus allen Tabellenausschnitten des angegebenen Subclusters.

Funktionen für annähernde Statistiken auf Tupel-Ebene

rds_aurora.limitless_pgstattuple_approx(relation_name)

  • Zweck: annähernde Statistiken auf Tupel-Ebene für Standardtabellen und deren Indizes extrahieren

  • Eingabe: relation_name (Text): der Beziehungsname

  • Ausgabe: Spalten, die mit denen übereinstimmen, die von der Funktion pgstattuple_approx in Aurora PostgreSQL zurückgegeben werden

rds_aurora.limitless_pgstattuple_approx(relation_name, subcluster_id)

  • Zweck: annähernde Statistiken auf Tupel-Ebene für Referenz-, Sharded- und Katalogtabellen (sowie deren Indizes) extrahieren

  • Eingabe:

    • relation_name (Text): der Beziehungsname

    • subcluster_id (Text): die Subcluster-ID des Knotens, auf dem die Statistiken extrahiert werden sollen

  • Ausgabe:

    • Bei Referenz- und Katalogtabellen (einschließlich ihrer Indizes) stimmen die Spalten mit denen in Aurora PostgreSQL überein.

    • Bei Sharded-Tabellen stellen die Statistiken nur die Partition der Tabelle dar, die sich auf dem angegebenen Subcluster befindet.

Anmerkung

Derzeit unterstützt Aurora PostgreSQL Limitless Database die Erweiterung pgstattuple für materialisierte Ansichten, TOAST-Tabellen oder temporäre Tabellen nicht.

In Aurora PostgreSQL Limitless Database müssen Sie die Eingabe als Text bereitstellen, obwohl Aurora PostgreSQL auch andere Formate unterstützt.

Fremdschlüssel

Beschränkungen bezüglich Fremdschlüsseln (FOREIGN KEY) werden mit einigen Einschränkungen unterstützt:

  • CREATE TABLE mit FOREIGN KEY wird nur für Standardtabellen unterstützt. Wenn Sie FOREIGN KEY verwenden möchten, um eine Sharded- oder Referenztabelle anzufertigen, erstellen Sie zunächst die Tabelle ohne Fremdschlüsselbeschränkung. Ändern Sie sie dann mit der folgenden Anweisung:

    ALTER TABLE ADD CONSTRAINT;
  • Eine Standardtabelle kann nicht in eine Sharded- oder Referenztabelle konvertiert werden, wenn für die Tabelle eine Fremdschlüsselbeschränkung gilt. Löschen Sie die Beschränkung und fügen Sie sie nach der Konvertierung hinzu.

  • Die folgenden Einschränkungen gelten für die verschiedenen Tabellentypen, was Fremdschlüsselbeschränkungen betrifft:

    • Für eine Standardtabelle kann eine Fremdschlüsselbeschränkung hinsichtlich einer anderen Standardtabelle gelten.

    • Für eine Sharded-Tabelle kann eine Fremdschlüsselbeschränkung gelten, wenn die übergeordneten und untergeordneten Tabellen nebeneinander angeordnet sind und der Fremdschlüssel eine Obermenge des Shard-Schlüssels bildet.

    • Für eine Sharded-Tabelle kann eine Fremdschlüsselbeschränkung hinsichtlich einer Referenztabelle gelten.

    • Für eine Referenztabelle kann eine Fremdschlüsselbeschränkung hinsichtlich einer anderen Referenztabelle gelten.

Fremdschlüsseloptionen

Fremdschlüssel werden in Aurora PostgreSQL Limitless Database für einige DDL-Optionen unterstützt. In der folgenden Tabelle sind Optionen aufgeführt, die zwischen Tabellen in Aurora PostgreSQL Limitless Database unterstützt und nicht unterstützt werden.

DDL-Option Referenz zu Referenz Sharded zu Sharded (nebeneinander angeordnet) Sharded zu Referenz Standard zu Standard

DEFERRABLE

Ja Ja Ja Ja

INITIALLY DEFERRED

Ja Ja Ja Ja

INITIALLY IMMEDIATE

Ja Ja Ja Ja

MATCH FULL

Ja Ja Ja Ja

MATCH PARTIAL

Nein Nein Nein Nein

MATCH SIMPLE

Ja Ja Ja Ja

NOT DEFERRABLE

Ja Ja Ja Ja

NOT VALID

Ja Nein Nein Ja

ON DELETE CASCADE

Ja Ja Ja Ja

ON DELETE NO ACTION

Ja Ja Ja Ja

ON DELETE RESTRICT

Ja Ja Ja Ja

ON DELETE SET DEFAULT

Nein Nein Nein Nein

ON DELETE SET NULL

Ja Nein Nein Ja

ON UPDATE CASCADE

Nein Nein Nein Ja

ON UPDATE NO ACTION

Ja Ja Ja Ja

ON UPDATE RESTRICT

Ja Ja Ja Ja

ON UPDATE SET DEFAULT

Nein Nein Nein Nein

ON UPDATE SET NULL

Ja Nein Nein Ja

Beispiele

  • Standard zu 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)
  • Sharded zu Sharded (nebeneinander angeordnet):

    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);
  • Sharded zu Referenz:

    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);
  • Referenz zu Referenz:

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

Funktionen

Funktionen werden in Aurora PostgreSQL Limitless Database unterstützt.

Die folgenden DDLs werden für Funktionen unterstützt:

CREATE FUNCTION

Mit diesem Befehl können Sie Funktionen wie in Aurora PostgreSQL erstellen. Sie können damit nur nicht ihre Volatilität ändern, während Sie sie ersetzen.

Weitere Informationen finden Sie im Abschnitt CREATE FUNCTION der PostgreSQL-Dokumentation.

ALTER FUNCTION

Mit diesem Befehl können Sie Funktionen wie in Aurora PostgreSQL ändern, nur nicht ihre Volatilität.

Weitere Informationen finden Sie im Abschnitt ALTER FUNCTION der PostgreSQL-Dokumentation.

DROP FUNCTION

Sie können Funktionen wie in Aurora PostgreSQL löschen.

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

Weitere Informationen finden Sie im Abschnitt DROP FUNCTION der PostgreSQL-Dokumentation.

Verteilung der Funktionen

Wenn alle Anweisungen einer Funktion auf einen einzelnen Shard ausgerichtet sind, empfiehlt es sich, die gesamte Funktion auf den Ziel-Shard zu übertragen. Auf diese Weise wird das Ergebnis zurück an den Router propagiert und die Funktion wird nicht am Router selbst aufgedröselt. Die Pushdown-Option für Funktionen und gespeicherte Verfahren ist nützlich für Kunden, die ihre Funktion oder ihr gespeichertes Verfahren näher an der Datenquelle, also dem Shard, ausführen möchten.

Um eine Funktion zu verteilen, müssen Sie sie zuerst erstellen und dann das Verfahren rds_aurora.limitless_distribute_function aufrufen. Für diese Funktion gilt folgende Syntax:

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

Die Funktion nutzt die folgenden Parameter:

  • function_prototype: die Funktion, die verteilt werden soll. Erwähnen Sie nur die Eingabeargumente und keines der Ausgabeargumente.

    Wenn eines der Argumente als OUT-Parameter definiert ist, nehmen Sie seinen Typ nicht in die Argumente von function_prototype auf.

  • ARRAY['shard_key']: die Liste der Funktionsargumente, die als Shard-Schlüssel für die Funktion identifiziert wurden

  • collocating_table: die Sharded-Tabelle, die den Datenbereich auf dem Ziel-Shard enthält

Um den Shard zu identifizieren, auf dem diese Funktion ausgeführt werden soll, hasht das System das Argument ARRAY['shard_key'] und erkennt in collocating_table den Shard, der den Bereich mit diesem Hash-Wert hostet.

Einschränkungen

Wenn Sie eine Funktion oder ein Verfahren verteilen, befasst sie oder es sich nur mit Daten, die durch den Shard-Schlüsselbereich in diesem Shard begrenzt sind. In Fällen, in denen Funktionen oder Verfahren versuchen, auf Daten von einem anderen Shard zuzugreifen, unterscheiden sich die von den verteilten Funktionen oder Verfahren zurückgegeben Ergebnisse von denen der nicht verteilten Funktionen oder Verfahren.

Sie erstellen beispielsweise eine Funktion, die Abfragen enthält, die mehrere Shards betreffen werden, rufen dann aber das Verfahren rds_aurora.limitless_distribute_function auf, um sie zu verteilen. Wenn Sie diese Funktion aufrufen, indem Sie Argumente für einen Shard-Schlüssel angeben, werden die Ergebnisse ihrer Ausführung wahrscheinlich durch die in diesem Shard vorhandenen Werte begrenzt. Die Ergebnisse unterscheiden sich von denen, die ohne Verteilung der Funktion generiert wurden.

Beispiele

Nehmen wir an, wir haben die Funktion func, die Sharded-Tabelle customers und den Shard-Schlüssel 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; $$;

Jetzt verteilen wir diese Funktion:

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

Im Folgenden sehen Sie Beispiel-Abfragepläne.

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)

Das folgende Beispiel zeigt ein Verfahren mit IN- und OUT-Parametern als Argumente.

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;

Das folgende Beispiel verteilt das Verfahren nur unter Verwendung von IN-Parametern.

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)

Funktionsvolatilität

Sie können feststellen, ob eine Funktion unveränderlich, stabil oder volatil ist, indem Sie den Wert provolatile in der Ansicht pg_proc überprüfen. Der Wert provolatile gibt an, ob das Ergebnis der Funktion nur von ihren Eingabeargumenten abhängt oder auch von externen Faktoren beeinflusst wird.

Der Wert ist einer der folgenden:

  • i: unveränderliche Funktionen, die immer dasselbe Ergebnis für dieselben Eingaben liefern

  • s: stabile Funktionen, deren Ergebnisse (für feste Eingaben) sich innerhalb eines Scans nicht ändern

  • v: flüchtige Funktionen, deren Ergebnisse sich jederzeit ändern können Nutzen Sie v auch für Funktionen mit Nebeneffekten, sodass deren Aufrufe nicht einfach optimiert werden können.

Die folgenden Beispiele zeigen flüchtige Funktionen.

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)

Die Volatilität einer vorhandenen Funktion lässt sich in Aurora PostgreSQL Limitless Database nicht ändern. Dies gilt gleichermaßen für Befehle des Typs ALTER FUNCTION und des Typs CREATE OR REPLACE FUNCTION, wie in den folgenden Beispielen gezeigt.

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

Wir empfehlen Ihnen dringend, Funktionen die richtigen Volatilitäten zuzuweisen. Wenn Ihre Funktion beispielsweise SELECT aus mehreren Tabellen verwendet oder auf Datenbankobjekte verweist, legen Sie sie nicht als IMMUTABLE fest. Wenn sich der Tabelleninhalt jemals ändert, geht damit die Unveränderlichkeit verloren.

Aurora PostgreSQL erlaubt SELECT innerhalb von unveränderlichen Funktionen, aber die Ergebnisse könnten falsch sein. Aurora PostgreSQL Limitless Database kann sowohl Fehler als auch falsche Ergebnisse zurückgeben. Weitere Informationen finden Sie im Abschnitt Volatilitätskategorien von Funktionen der PostgreSQL-Dokumentation.

Sequenzen

Benannte Sequenzen sind Datenbankobjekte, die eindeutige Zahlen in auf- oder absteigender Reihenfolge generieren. CREATE SEQUENCE erstellt einen Generator für neue Sequenznummern. Sequenzwerte sind garantiert eindeutig.

Wenn Sie eine benannte Sequenz in Aurora PostgreSQL Limitless Database erstellen, wird ein verteiltes Sequenzobjekt erstellt. Daraufhin verteilt Aurora PostgreSQL Limitless Database nicht überlappende Blöcke von Sequenzwerten auf alle Distributed Transaction Router (Router). Blöcke werden auf Routern als lokale Sequenzobjekte dargestellt; daher werden Sequenzoperationen wie nextval und currval lokal ausgeführt. Router arbeiten unabhängig voneinander und fordern bei Bedarf neue Blöcke aus der verteilten Sequenz an.

Weitere Informationen zu Sequenzen finden Sie im Abschnitt CREATE SEQUENCE der PostgreSQL-Dokumentation.

Anfordern eines neuen Blocks

Sie konfigurieren die Größe der Blöcke, die Routern zugewiesen werden, mithilfe des Parameters rds_aurora.limitless_sequence_chunk_size. Der Standardwert ist 250000. Jeder Router besitzt zunächst zwei Blöcke: einen aktiven und einen reservierten. Aktive Blöcke werden verwendet, um lokale Sequenzobjekte zu konfigurieren (Einstellung minvalue undmaxvalue), und reservierte Blöcke werden in einer internen Katalogtabelle gespeichert. Wenn ein aktiver Block den Mindest- oder Höchstwert erreicht, wird er durch den reservierten Block ersetzt. Dazu wird ALTER SEQUENCE intern verwendet, was bedeutet, dass AccessExclusiveLock erworben wird.

Hintergrund-Worker werden alle 10 Sekunden auf Router-Knoten ausgeführt, um Sequenzen nach verwendeten reservierten Blöcken zu durchsuchen. Wenn ein verwendeter Block gefunden wird, fordert der Worker bei der verteilten Sequenz einen neuen Block an. Achten Sie darauf, die Blockgröße so festzulegen, dass die Hintergrund-Worker genügend Zeit haben, neue Blöcke anzufordern. Remoteanfragen treten niemals im Kontext von Benutzersitzungen auf, was bedeutet, dass Sie nicht direkt eine neue Sequenz anfordern können.

Einschränkungen

Die folgenden Einschränkungen gelten für Sequenzen in Aurora PostgreSQL Limitless Database:

  • Der pg_sequence-Katalog, die pg_sequences-Funktion und die SELECT * FROM sequence_name-Anweisung zeigen alle nur den lokalen Sequenzstatus, nicht den verteilten Status.

  • Sequenzwerte sind garantiert eindeutig und innerhalb einer Sitzung garantiert monoton. Sie können jedoch bei nextval-Anweisungen, die in anderen Sitzungen ausgeführt werden, in Unordnung geraten, wenn diese Sitzungen mit anderen Routern verbunden sind.

  • Stellen Sie sicher, dass die Sequenzgröße (Anzahl der verfügbaren Werte) ausreicht, um auf alle Router verteilt zu werden. Verwenden Sie den Parameter rds_aurora.limitless_sequence_chunk_size, um die chunk_size zu konfigurieren. (Jeder Router hat zwei Blöcke.)

  • Die CACHE-Option wird unterstützt, aber der Cache muss kleiner sein als chunk_size.

Nicht unterstützte Optionen

Die folgenden Optionen werden für Sequenzen in Aurora PostgreSQL Limitless Database nicht unterstützt.

Sequenz-Bearbeitungsfunktionen

Die Funktion setval wird nicht unterstützt. Weitere Informationen finden Sie im Abschnitt Sequenz-Bearbeitungsfunktionen in der PostgreSQL-Dokumentation.

CREATE SEQUENCE

Die folgenden Optionen werden nicht unterstützt.

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

Weitere Informationen finden Sie im Abschnitt CREATE SEQUENCE der PostgreSQL-Dokumentation.

ALTER SEQUENCE

Die folgenden Optionen werden nicht unterstützt.

ALTER SEQUENCE [[ NO ] CYCLE]

Weitere Informationen finden Sie im Abschnitt ALTER SEQUENCE der PostgreSQL-Dokumentation.

ALTER TABLE

Der Befehl ALTER TABLE wird für Sequenzen nicht unterstützt.

Beispiele

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)
Sequenz-Bearbeitungsfunktionen
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)

Sequenzansichten

Aurora PostgreSQL Limitless Database bietet die folgenden Ansichten für Sequenzen.

rds_aurora.limitless_distributed_sequence

Diese Ansicht zeigt den Status und die Konfiguration einer verteilten Sequenz. Die Spalten minvalue, maxvalue, start, inc und cache haben dieselbe Bedeutung wie in der Ansicht pg_sequences und zeigen die Optionen, mit denen die Sequenz erstellt wurde. Die Spalte lastval zeigt den letzten zugewiesenen oder reservierten Wert in einem verteilten Sequenzobjekt. Dies bedeutet nicht, dass der Wert bereits verwendet wurde, da Router Sequenzblöcke lokal speichern.

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

Diese Ansicht zeigt verteilte Sequenzmetadaten und aggregiert Sequenzmetadaten von Cluster-Knoten. Sie verwendet die folgenden Spalten:

  • subcluster_id: die ID des Cluster-Knotens, dem ein Block gehört

  • Aktiver Block: ein Block einer Sequenz, der verwendet wird (active_minvalue, active_maxvalue)

  • Reservierter Block: der lokale Block, der als Nächstes verwendet wird (reserved_minvalue, reserved_maxvalue)

  • local_last_value: der zuletzt beobachtete Wert aus einer lokalen Sequenz

  • chunk_size: die Größe eines Blocks, wie sie bei der Erstellung konfiguriert wurde

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)

Beheben von Sequenzproblemen

Die folgenden Probleme können bei Sequenzen auftreten.

Blockgröße reicht nicht aus

Wenn für die Blockgröße ein zu geringer Wert festgelegt wurde und die Transaktionsrate hoch ist, haben die Hintergrund-Worker möglicherweise nicht genug Zeit, um neue Blöcke anzufordern, bevor die aktiven Blöcke verbraucht sind. Dies kann zu Konflikten und Warteereignissen wie LIMITLESS:AuroraLimitlessSequenceReplace, LWLock:LockManager, Lockrelation und LWlock:bufferscontent führen.

Erhöhen Sie den Wert des Parameters rds_aurora.limitless_sequence_chunk_size.

Sequenz-Cache zu hoch

In PostgreSQL erfolgt das Sequenz-Caching auf Sitzungsebene. Jede Sitzung weist während eines Zugriffs auf das Sequenzobjekt aufeinanderfolgende Sequenzwerte zu und erhöht den last_value des Sequenzobjekts entsprechend. Sobald nextval innerhalb dieser Sitzung erneut verwendet wird, werden dann einfach die vorab zugewiesenen Werte zurückgegeben, ohne dass auf das Sequenzobjekt zugegriffen wird.

Alle Nummern, die innerhalb einer Sitzung zugewiesen, aber nicht verwendet wurden, gehen verloren, wenn die Sitzung endet, was zu „Lücken“ in der Sequenz führt. Dies kann zu einem raschen Verbrauch des sequence_chunk und somit zu Konflikten und Warteereignissen wie LIMITLESS:AuroraLimitlessSequenceReplace, LWLock:LockManager, Lockrelation und LWlock:bufferscontent führen.

Verringern Sie den festgelegten Wert für den Sequenz-Cache.

Die folgende Abbildung zeigt Warteereignisse, die durch Sequenzprobleme verursacht wurden.

Warteereignisse, die durch Sequenzprobleme verursacht wurden