Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
PLATÍ PRO: Flexibilní server Azure Database for PostgreSQL
V tomto článku se dozvíte, jak optimalizovat flexibilní server Azure Database for PostgreSQL pomocí rozšíření PostgreSQL Partition Manager (pg_partman
).
Když se tabulky v databázi stanou velkými, je obtížné spravovat, jak často se vysadí, kolik místa zabírají a jak zajistit efektivitu indexů. Tento problém může zpomalit dotazy a ovlivnit výkon. Dělení velkých tabulek je řešením pro tyto situace.
V tomto článku vytvoříte pg_partman
na flexibilním serveru Azure Database for PostgreSQL oddíly založené na rozsahu tabulek.
Požadavky
Pokud chcete rozšíření povolit pg_partman
, postupujte takto:
Na webu Azure Portal vyberte
pg_partman
v seznamu parametrů serveru proazure.extensions
.CREATE EXTENSION pg_partman;
Zahrňte související
pg_partman_bgw
rozšíření doshared_preload_libraries
souboru . Nabízí naplánovanou funkcirun_maintenance()
. Postará se o sady oddílů, které jsouautomatic_maintenance
nastavené naON
hodnotu inpart_config
.Pomocí parametrů serveru na webu Azure Portal můžete změnit následující možnosti konfigurace, které ovlivňují proces BGW (Background Writer):
pg_partman_bgw.dbname
:Požadovaný. Tento parametr by měl obsahovat jednu nebo více databází, kderun_maintenance()
je potřeba spustit. Pokud existuje více než jedna databáze, použijte seznam oddělený čárkami. Pokud není nic nastavené,pg_partman_bgw
nespustí proceduru.pg_partman_bgw.interval
: Počet sekund mezi voláními proceduryrun_maintenance()
. Výchozí hodnota je3600
(1 hodina). Tuto hodnotu můžete aktualizovat na základě požadavků projektu.pg_partman_bgw.role
: Role, kterárun_maintenance()
procedura běží jako. Výchozí hodnota jepostgres
. Je povolen pouze jeden název role.pg_partman_bgw.analyze
: Stejný účel jako argument argumentup_analyze
run_maintenance()
. Ve výchozím nastavení je nastavená naOFF
hodnotu .pg_partman_bgw.jobmon
: Stejný účel jako argument argumentup_jobmon
run_maintenance()
. Ve výchozím nastavení je nastavená naON
hodnotu .
Poznámka:
Když funkce identity používá sekvence, data z nadřazené tabulky získávají nové hodnoty sekvence. Při přímém přidání dat do podřízené tabulky nevygeneruje nové sekvenční hodnoty.
Rozšíření
pg_partman
používá šablonu k řízení, zda jeUNLOGGED
tabulka . To znamená,ALTER TABLE
že příkaz nemůže změnit tento stav sady oddílů. Změnou stavu šablony ji můžete použít pro všechny budoucí oddíly. U existujících podřízených tabulek ale musíte příkaz použítALTER TABLE
ručně. Tato chyba ukazuje, proč.
Nastavení oprávnění
U role superuživatele se nevyžaduje pg_partman
. Jediným požadavkem je, že role, která spouští pg_partman
funkce, má vlastnictví nad všemi sadami oddílů a schématy, ve kterých se vytvoří nové objekty.
Doporučujeme vytvořit samostatnou roli pro pg_partman
schéma a předat jí vlastnictví schématu a všem objektům, na kterých pg_partman
bude fungovat:
CREATE ROLE partman_role WITH LOGIN;
CREATE SCHEMA partman;
GRANT ALL ON SCHEMA partman TO partman_role;
GRANT ALL ON ALL TABLES IN SCHEMA partman TO partman_role;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA partman TO partman_role;
GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA partman TO partman_role;
GRANT ALL ON SCHEMA <partition_schema> TO partman_role;
GRANT TEMPORARY ON DATABASE <databasename> to partman_role; -- This allows temporary table creation to move data.
Vytvoření oddílů
Rozšíření pg_partman
podporuje pouze oddíly typu rozsahu, nikoli oddíly založené na triggerech. Následující kód ukazuje, jak pg_partman
pomáhá s dělením tabulky:
CREATE SCHEMA partman;
CREATE TABLE partman.partition_test
(a_int INT, b_text TEXT,c_text TEXT,d_date TIMESTAMP DEFAULT now())
PARTITION BY RANGE(d_date);
CREATE INDEX idx_partition_date ON partman.partition_test(d_date);
Pomocí create_parent
funkce můžete nastavit požadovaný počet oddílů v tabulce oddílů:
SELECT public.create_parent(
p_parent_table := 'partman.partition_test',
p_control := 'd_date',
p_type := 'native',
p_interval := 'daily',
p_premake :=20,
p_start_partition := (now() - interval '10 days')::date::text
);
UPDATE public.part_config
SET infinite_time_partitions = true,
retention = '1 hour',
retention_keep_table=true
WHERE parent_table = 'partman.partition_test';
Předchozí příkaz rozdělí p_parent_table
na menší části na p_control
základě sloupce pomocí nativního dělení. (Druhá možnost je dělení na základě triggerů, ale pg_partman
aktuálně ji nepodporuje.) Oddíly se vytvářejí v denním intervalu.
Příklad vytvoří 20 budoucích oddílů předem místo použití výchozí hodnoty 4
. Určuje také , kde se p_start_partition
zmíníte o minulém datu, od kterého se mají oddíly začínat.
Funkce create_parent()
naplní dvě tabulky: part_config
a part_config_sub
. K dispozici je funkce údržby. run_maintenance()
Pro tento postup můžete naplánovat cron
pravidelné spuštění úlohy. Tato funkce zkontroluje všechny nadřazené tabulky v part_config
tabulce a vytvoří pro ně nové oddíly nebo spustí zásady uchovávání informací nastavené pro tabulky. Další informace o funkcích a tabulkách najdete v pg_partman
dokumentaci k rozšíření Správce oddílů PostgreSQL na GitHubu.
Pokud chcete vytvořit nové oddíly při run_maintenance()
každém spuštění na pozadí prostřednictvím pg_partman_bgw
rozšíření, spusťte následující UPDATE
příkaz:
UPDATE partman.part_config SET premake = premake+1 WHERE parent_table = 'partman.partition_test';
Pokud je předmake stejný a váš run_maintenance()
postup se spustí, pro tento den se nevytvořijí žádné nové oddíly. Pro další den, protože premake definuje z aktuálního dne, se vytvoří nový oddíl pro den se spuštěním vaší run_maintenance()
funkce.
Pomocí následujících INSERT INTO
příkazů vložte 100 000 řádků pro každý měsíc:
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(1,100000),GENERATE_SERIES(1, 100000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(1, 100000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-03-01',timestamp '2024-03-30', interval '1 day ') ;
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(100000,200000),GENERATE_SERIES(100000,200000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(100000,200000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-04-01',timestamp '2024-04-30', interval '1 day') ;
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(200000,300000),GENERATE_SERIES(200000,300000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(200000,300000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-05-01',timestamp '2024-05-30', interval '1 day') ;
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(300000,400000),GENERATE_SERIES(300000,400000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(300000,400000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-06-01',timestamp '2024-06-30', interval '1 day') ;
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(400000,500000),GENERATE_SERIES(400000,500000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(400000,500000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-07-01',timestamp '2024-07-30', interval '1 day') ;
Spuštěním následujícího příkazu v PostgreSQL zobrazte vytvořené oddíly:
\d+ partman.partition_test;
Tady je výstup SELECT
příkazu, který jste spustili:
Ruční spuštění postupu údržby
Příkaz můžete spustit partman.run_maintenance()
ručně namísto použití pg_partman_bgw
. Pomocí následujícího příkazu spusťte postup údržby ručně:
SELECT partman.run_maintenance(p_parent_table:='partman.partition_test');
Upozorňující
Pokud před vytvořením oddílů vložíte data, data se přejdou do výchozího oddílu. Pokud výchozí oddíl obsahuje data, která patří do nového oddílu, který chcete vytvořit později, zobrazí se výchozí chyba porušení oddílu a postup nefunguje. Změňte hodnotu předmake doporučenou dříve a spusťte proceduru.
Naplánování postupu údržby
Spusťte postup údržby pomocí příkazu pg_cron
:
Nejprve povolte
pg_cron
na serveru. Na webu Azure Portal přidejtepg_cron
parametryazure. extensions
,shared_preload_libraries
acron.database_name
serveru.Vyberte tlačítko Uložit a nechte nasazení dokončit.
Po dokončení
pg_cron
nasazení se vytvoří automaticky. Pokud se ho pokusíte nainstalovat, zobrazí se následující zpráva:CREATE EXTENSION pg_cron;
ERROR: extension "pg_cron" already exists
K naplánování
cron
úlohy použijte následující příkaz:SELECT cron.schedule_in_database('sample_job','@hourly', $$SELECT partman.run_maintenance(p_parent_table:= 'partman.partition_test')$$,'postgres');
Pokud chcete zobrazit všechny
cron
úlohy, použijte následující příkaz:SELECT * FROM cron.job;
-[ RECORD 1 ]----------------------------------------------------------------------- jobid | 1 schedule | @hourly command | SELECT partman.run_maintenance(p_parent_table:= 'partman.partition_test') nodename | /tmp nodeport | 5432 database | postgres username | postgres active | t jobname | sample_job
Pokud chcete zkontrolovat historii spuštění úlohy, použijte následující příkaz:
SELECT * FROM cron.job_run_details;
Výsledky zobrazují nulové záznamy, protože jste úlohu ještě nespustí.
Pokud chcete zrušit plánování
cron
úlohy, použijte následující příkaz:SELECT cron.unschedule(1);
Nejčastější dotazy
pg_partman_bgw
Proč nespouštět postup údržby na základě zadaného intervalu?Zkontrolujte parametr
pg_partman_bgw.dbname
serveru a aktualizujte ho správným názvem databáze. Zkontrolujte také parametrpg_partman_bgw.role
serveru a zadejte odpovídající roli. Měli byste také zajistit, abyste se připojili k serveru pomocí stejného uživatele a vytvořili rozšíření místo Postgres.Při spuštění postupu údržby dochází k chybě
pg_partman_bgw
. Jaké můžou být důvody?Podívejte se na předchozí odpověď.
Návody nastavit oddíly tak, aby začínaly od předchozího dne?
Funkce
p_start_partition
odkazuje na datum, ze kterého musí být oddíl vytvořen. Spusťte následující příkaz:SELECT public.create_parent( p_parent_table := 'partman.partition_test', p_control := 'd_date', p_type := 'native', p_interval := 'daily', p_premake :=20, p_start_partition := (now() - interval '10 days')::date::text );