Osvědčené postupy pro hromadné nahrávání dat na flexibilním serveru Azure Database for PostgreSQL
PLATÍ PRO: Flexibilní server Azure Database for PostgreSQL
Tento článek popisuje různé metody hromadného načítání dat na flexibilním serveru Azure Database for PostgreSQL spolu s osvědčenými postupy pro počáteční načítání dat v prázdných databázích i přírůstkových načítání dat.
Metody načítání
Následující metody načítání dat jsou uspořádány v pořadí od nejvíce časově náročných po nejméně časově náročné:
- Spusťte příkaz s jedním záznamem
INSERT
. - Dávkové do 100 až 1000 řádků na potvrzení. Blok transakce můžete použít k zabalení více záznamů na potvrzení.
- Spusťte
INSERT
s více hodnotami řádků. - Spusťte příkaz
COPY
.
Upřednostňovanou metodou načítání dat do databáze je použití COPY
příkazu. COPY
Pokud příkaz není možný, je použití dávky INSERT
další nejlepší metodou. Vícevláknové zpracování pomocí COPY
příkazu je optimální metodou hromadného načítání dat.
Osvědčené postupy pro počáteční načtení dat
Vyřazení indexů
Před počátečním načtením dat doporučujeme v tabulkách odstranit všechny indexy. Po načtení dat je vždy efektivnější vytvářet indexy.
Omezení přetažení
Hlavní omezení poklesu jsou popsána zde:
Omezení jedinečných klíčů
Pokud chcete dosáhnout silného výkonu, doporučujeme před počátečním načtením dat odstranit jedinečná omezení klíče a po dokončení načítání dat je znovu vytvořit. Vyřazení omezení jedinečných klíčů však zruší ochranu proti duplicitním datům.
Omezení cizího klíče
Doporučujeme před počátečním načtením dat odstranit omezení cizího klíče a po dokončení načítání dat je znovu vytvořit.
Změna parametru
session_replication_role
tak, abyreplica
se také zakázaly všechny kontroly cizího klíče. Mějte však na paměti, že provedení změny může ponechat data v nekonzistentním stavu, pokud se správně nepoužívá.
Nepřilogované tabulky
Než je použijete při počátečním načtení dat, zvažte výhody a nevýhody použití nezalogovaných tabulek.
Díky použití nepřilogovaných tabulek se data načítají rychleji. Data zapsaná do nepřipsaných tabulek se nezapisují do protokolu s předstihem zápisu.
Nevýhody použití nepřilogovaných tabulek jsou:
- Nejsou v bezpečí. Nelogovaná tabulka se po chybovém ukončení nebo vypnutí automaticky zkrátí.
- Data z nelogovaných tabulek se nedají replikovat na pohotovostní servery.
Pokud chcete vytvořit nepřiřazenou tabulku nebo změnit existující tabulku na nepřiřazenou tabulku, použijte následující možnosti:
Vytvořte novou nepřiřazenou tabulku pomocí následující syntaxe:
CREATE UNLOGGED TABLE <tablename>;
Převeďte existující zaprotokolovanou tabulku na nezalogovanou tabulku pomocí následující syntaxe:
ALTER TABLE <tablename> SET UNLOGGED;
Ladění parametrů serveru
autovacuum
: Během počátečního načtení dat je nejlepší vypnoutautovacuum
. Po dokončení počátečního načtení doporučujeme spustit příručkuVACUUM ANALYZE
pro všechny tabulky v databázi a pak zapnoutautovacuum
.
Poznámka:
Postupujte podle doporučení, pouze pokud je dostatek paměti a místa na disku.
maintenance_work_mem
: U instance flexibilního serveru Azure Database for PostgreSQL je možné nastavit maximálně 2 gigabajty (GB).maintenance_work_mem
pomáhá zrychlit vytváření automatického úklidu, indexu a cizího klíče.checkpoint_timeout
: V instancicheckpoint_timeout
flexibilního serveru Azure Database for PostgreSQL je možné hodnotu zvýšit na maximálně 24 hodin z výchozího nastavení 5 minut. Doporučujeme zvýšit hodnotu na 1 hodinu před počátečním načtením dat na instanci flexibilního serveru Azure Database for PostgreSQL.checkpoint_completion_target
: Doporučujeme hodnotu 0,9.max_wal_size
: Můžete nastavit maximální povolenou hodnotu v instanci flexibilního serveru Azure Database for PostgreSQL, což je 64 GB při počátečním načtení dat.wal_compression
: Je možné zapnout. Povolením tohoto parametru můžou vzniknout další náklady na procesor vynaložené na kompresi během protokolování do protokolu WAL (Write-ahead Log) a při dekompresi během přehrávání WAL.
Doporučení flexibilního serveru Azure Database for PostgreSQL
Než začnete s počátečním zatížením dat instance flexibilního serveru Azure Database for PostgreSQL, doporučujeme:
- Zakažte vysokou dostupnost na serveru. Můžete ho povolit po dokončení počátečního načtení na primárním serveru.
- Po dokončení počátečního načtení dat vytvořte repliky pro čtení.
- Během počátečního načítání dat ho zajistěte minimální nebo úplně zakažte (například: zakažte pgaudit, pg_stat_statements, úložiště dotazů).
Opětovné vytvoření indexů a přidání omezení
Za předpokladu, že jste indexy a omezení před počátečním načtením vynechali, doporučujeme k vytváření indexů a přidávání omezení použít vysoké hodnoty ( maintenance_work_mem
jak už jsme zmínili dříve). Kromě toho můžete od PostgreSQL verze 11 upravit následující parametry pro rychlejší paralelní vytvoření indexu po počátečním načtení dat:
max_parallel_workers
: Nastaví maximální počet pracovních procesů, které může systém podporovat pro paralelní dotazy.max_parallel_maintenance_workers
: Řídí maximální počet pracovních procesů, které lze použít vCREATE INDEX
.
Indexy můžete vytvořit také tak, že vytvoříte doporučená nastavení na úrovni relace. Tady je příklad postupu:
SET maintenance_work_mem = '2GB';
SET max_parallel_workers = 16;
SET max_parallel_maintenance_workers = 8;
CREATE INDEX test_index ON test_table (test_column);
Osvědčené postupy pro přírůstkové načítání dat
Tabulky oddílů
Vždy doporučujeme rozdělit velké tabulky. Mezi výhody dělení, zejména při přírůstkových zatíženích, patří:
- Vytváření nových oddílů na základě nových rozdílových dat umožňuje efektivní přidávání nových dat do tabulky.
- Údržba tabulek je jednodušší. Během přírůstkového načítání dat můžete oddíl vypustit, abyste se vyhnuli časově náročným odstraňováním ve velkých tabulkách.
- Funkce Autovacuum se aktivuje pouze u oddílů, které byly změněny nebo přidány během přírůstkových načítání, což usnadňuje udržování statistik v tabulce.
Udržování aktuálních statistik tabulek
Monitorování a údržba statistik tabulek je důležitá pro výkon dotazů v databázi. Patří sem také scénáře, ve kterých máte přírůstkové načtení. PostgreSQL používá proces démona autovacuum k vyčištění mrtvých řazených kolekcí členů a analýze tabulek, aby se statistiky aktualizovaly. Další informace najdete v tématu Monitorování a ladění automatického úklidu.
Vytváření indexů pro omezení cizího klíče
Vytváření indexů pro cizí klíče v podřízených tabulkách může být výhodné v následujících scénářích:
- Data se aktualizují nebo odstraní v nadřazené tabulce. Při aktualizaci nebo odstranění dat v nadřazené tabulce se vyhledávání provádí v podřízené tabulce. Pokud chcete vyhledávání zrychlit, mohli byste indexovat cizí klíče v podřízené tabulce.
- Dotazy, kde uvidíte spojení nadřazených a podřízených tabulek v klíčových sloupcích.
Identifikace nepoužívaných indexů
Identifikujte nepoužívané indexy v databázi a odstraňte je. Indexy představují režijní náklady na načtení dat. Čím méně indexů v tabulce, tím lepší je výkon během příjmu dat.
Nepoužívané indexy můžete identifikovat dvěma způsoby: úložištěm dotazů a dotazem na použití indexu.
Úložiště dotazů
Funkce Úložiště dotazů pomáhá identifikovat indexy, které je možné vynechat na základě vzorců využití dotazů v databázi. Podrobné pokyny najdete v tématu Úložiště dotazů.
Po povolení úložiště dotazů na serveru můžete pomocí následujícího dotazu identifikovat indexy, které se dají vynechat připojením k azure_sys databázi.
SELECT * FROM IntelligentPerformance.DropIndexRecommendations;
Využití indexu
K identifikaci nepoužívaných indexů můžete použít také následující dotaz:
SELECT
t.schemaname,
t.tablename,
c.reltuples::bigint AS num_rows,
pg_size_pretty(pg_relation_size(c.oid)) AS table_size,
psai.indexrelname AS index_name,
pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,
CASE WHEN i.indisunique THEN 'Y' ELSE 'N' END AS "unique",
psai.idx_scan AS number_of_scans,
psai.idx_tup_read AS tuples_read,
psai.idx_tup_fetch AS tuples_fetched
FROM
pg_tables t
LEFT JOIN pg_class c ON t.tablename = c.relname
LEFT JOIN pg_index i ON c.oid = i.indrelid
LEFT JOIN pg_stat_all_indexes psai ON i.indexrelid = psai.indexrelid
WHERE
t.schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY 1, 2;
Sloupce number_of_scans
a tuples_fetched
, tuples_read
by indikovaly index usage.number_of_scans hodnotu sloupce nula bodů jako index, který se nepoužívá.
Ladění parametrů serveru
Poznámka:
Postupujte podle doporučení v následujících parametrech jenom v případě, že je dostatek paměti a místa na disku.
maintenance_work_mem
: Tento parametr lze nastavit na maximálně 2 GB na instanci flexibilního serveru Azure Database for PostgreSQL.maintenance_work_mem
pomáhá urychlit vytváření indexů a přidávání cizích klíčů.checkpoint_timeout
: V instancicheckpoint_timeout
flexibilního serveru Azure Database for PostgreSQL je možné hodnotu zvýšit na 10 nebo 15 minut z výchozího nastavení 5 minut. Zvýšenícheckpoint_timeout
na větší hodnotu, například 15 minut, může snížit vstupně-výstupní zatížení, ale nevýhodou je, že obnovení v případě chybového ukončení trvá déle. Před provedením změny doporučujeme pečlivě zvážit.checkpoint_completion_target
: Doporučujeme hodnotu 0,9.max_wal_size
: Tato hodnota závisí na SKU, úložišti a úloze. Jeden ze způsobů, jak získat správnou hodnotu,max_wal_size
je uveden v následujícím příkladu.Během špičky pracovní doby dorazí na hodnotu následujícím způsobem:
a. Spuštěním následujícího dotazu převezměte aktuální pořadové číslo protokolu WAL (LSN):
SELECT pg_current_wal_lsn ();
b. Počkejte na
checkpoint_timeout
počet sekund. Spuštěním následujícího dotazu převezměte aktuální WAL LSN:SELECT pg_current_wal_lsn ();
c. Pomocí těchto dvou výsledků zkontrolujte rozdíl v GB:
SELECT round (pg_wal_lsn_diff('LSN value when run second time','LSN value when run first time')/1024/1024/1024,2) WAL_CHANGE_GB;
wal_compression
: Je možné zapnout. Povolením tohoto parametru můžou vzniknout další náklady na procesor strávené při kompresi během protokolování WAL a při dekompresi během přehrávání WAL.