Procedure consigliate per il caricamento bulk dei dati in Database di Azure per PostgreSQL - Server flessibile
SI APPLICA A: Database di Azure per PostgreSQL - Server flessibile
Questo articolo illustra vari metodi per caricare i dati in blocco nel server flessibile di Database di Azure per PostgreSQL, insieme alle procedure consigliate per i caricamenti iniziali dei dati in database vuoti e i caricamenti incrementali dei dati.
Metodi di caricamento
I metodi di caricamento dei dati seguenti sono disposti in ordine dal più lungo tempo al minor tempo necessario:
- Eseguire un comando
INSERT
a record singolo. - Batch in 100 a 1.000 righe per commit. È possibile usare un blocco di transazioni per eseguire il wrapping di più record per ogni commit.
- Eseguire
INSERT
con più valori di riga. - Eseguire il comando
COPY
.
Il metodo preferito per il caricamento dei dati in un database è il COPY
comando . Se il COPY
comando non è impossibile, batch INSERT
è il metodo migliore successivo. Il multithreading con un COPY
comando è ottimale per il caricamento bulk dei dati.
Passaggi per caricare i dati in blocco
Ecco i passaggi per caricare in blocco i dati in Database di Azure per PostgreSQL server flessibile.
Passaggio 1: Preparare i dati
Verificare che i dati siano puliti e formattati correttamente per il database.
Passaggio 2: Scegliere il metodo di caricamento
Selezionare il metodo di caricamento appropriato in base alle dimensioni e alla complessità dei dati.
Passaggio 3: Eseguire il metodo di caricamento
Eseguire il metodo di caricamento scelto per caricare i dati nel database.
Passaggio 4: Verificare i dati
Dopo il caricamento, verificare che i dati siano stati caricati correttamente nel database.
Procedure consigliate per i caricamenti iniziali dei dati
Ecco le procedure consigliate per i caricamenti iniziali dei dati.
Eliminare gli indici
Prima di eseguire un caricamento iniziale dei dati, è consigliabile eliminare tutti gli indici nelle tabelle. La creazione degli indici dopo il caricamento dei dati è sempre più efficiente.
Vincoli di rilascio
I vincoli di rilascio principali sono descritti di seguito:
- Vincoli di chiave univoca
Per ottenere prestazioni elevate, è consigliabile eliminare vincoli di chiave univoci prima del caricamento iniziale dei dati e crearli di nuovo dopo il completamento del caricamento dei dati. Tuttavia, l'eliminazione di vincoli di chiave univoci annulla le misure di sicurezza contro i dati duplicati.
- Vincoli di chiavi esterne
È consigliabile eliminare i vincoli di chiave esterna prima del caricamento iniziale dei dati e crearli di nuovo dopo il completamento del caricamento dei dati.
La modifica del parametro session_replication_role
in replica
disabilita anche tutti i controlli di chiave esterna. Tuttavia, se la modifica non viene usata correttamente, può lasciare i dati incoerenti.
Tabelle non registrate
Considerare i vantaggi e i svantaggi delle tabelle non registrate prima di usarle nei caricamenti iniziali dei dati.
L'uso di tabelle non registrate velocizza il caricamento dei dati. I dati scritti in tabelle non registrate non vengono scritti nel log write-ahead.
Gli svantaggi dell'uso di tabelle non registrate sono i seguenti:
- Non sono sicure per gli arresti anomali. Una tabella non registrata viene troncata automaticamente dopo un arresto anomalo o in seguito a un arresto non corretto.
- I dati delle tabelle non registrate non possono essere replicati nei server di standby.
Per creare una tabella non registrata o modificare una tabella esistente in una tabella non registrata, utilizzare le opzioni seguenti:
Creare una nuova tabella non registrata con la sintassi seguente:
CREATE UNLOGGED TABLE <tablename>;
Convertire una tabella registrata esistente in una tabella non registrata con la sintassi seguente:
ALTER TABLE <tablename> SET UNLOGGED;
Regolazione del parametro server
auto vacuum': It's best to turn off
auto vacuum' durante il caricamento iniziale dei dati. Al termine del caricamento iniziale, è consigliabile eseguire un manualeVACUUM ANALYZE
in tutte le tabelle del database e quindi attivareauto vacuum
.
Nota
Seguire le indicazioni riportate qui solo se sono disponibili memoria e spazio su disco sufficienti.
maintenance_work_mem
: può essere impostato su un massimo di 2 gigabyte (GB) in un'istanza del server flessibile di Database di Azure per PostgreSQL.maintenance_work_mem
consente di velocizzare la creazione automatica di vuoto, indice e chiave esterna.checkpoint_timeout
: in un'istanza del server flessibile di Database di Azure per PostgreSQL il valorecheckpoint_timeout
può essere aumentato fino a un massimo di 24 ore dall'impostazione predefinita di 5 minuti. È consigliabile aumentare il valore a 1 ora prima di caricare inizialmente i dati nell'istanza del server flessibile Database di Azure per PostgreSQL.checkpoint_completion_target
: è consigliabile usare il valore 0,9.max_wal_size
: può essere impostato sul valore massimo consentito in un'istanza del server flessibile di Database di Azure per PostgreSQL, ovvero 64 GB durante l'esecuzione del caricamento iniziale dei dati.wal_compression
: può essere attivato. L'abilitazione di questo parametro può comportare alcuni costi aggiuntivi della CPU per la compressione durante la registrazione e la decompressione dei log write-ahead durante la riproduzione wal.
Elementi consigliati
Prima di avviare un caricamento iniziale dei dati nell'istanza del server flessibile di Database di Azure per PostgreSQL, è consigliabile:
- Disabilitare la disponibilità elevata nel server. È possibile abilitarla dopo il completamento del caricamento iniziale nel server primario.
- Creare repliche di lettura al termine del caricamento iniziale dei dati.
- Rendere minima la registrazione o disabilitarla tutti insieme durante i caricamenti iniziali dei dati (ad esempio, disabilitare pgaudit, pg_stat_statements, archivio query).
Ricreare gli indici e aggiungere vincoli
Supponendo di aver eliminato gli indici e i vincoli prima del caricamento iniziale, è consigliabile usare valori elevati in (come indicato in maintenance_work_mem
precedenza) per creare indici e aggiungere vincoli. Inoltre, a partire dalla versione 11 di PostgreSQL, è possibile modificare i parametri seguenti per una creazione più rapida dell'indice parallelo dopo il caricamento iniziale dei dati:
max_parallel_workers
: imposta il numero massimo di ruoli di lavoro che il sistema può supportare per le query parallele.max_parallel_maintenance_workers
: controlla il numero massimo di processi di lavoro che possono essere usati inCREATE INDEX
.
È anche possibile creare gli indici rendendo le impostazioni consigliate a livello di sessione. Ecco un esempio di come eseguire questa operazione:
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);
Procedure consigliate per i caricamenti incrementali dei dati
Le procedure consigliate per i caricamenti incrementali dei dati sono descritte qui:
Partizionare le tabelle
È sempre consigliabile partizionare tabelle di grandi dimensioni. Alcuni vantaggi del partizionamento, in particolare durante i caricamenti incrementali, includono:
- La creazione di nuove partizioni in base ai nuovi delta rende efficiente l'aggiunta di nuovi dati alla tabella.
- La gestione delle tabelle diventa più semplice. È possibile eliminare una partizione durante un caricamento incrementale dei dati per evitare eliminazioni che richiedono molto tempo in tabelle di grandi dimensioni.
- Autovacuum viene attivato solo nelle partizioni modificate o aggiunte durante i caricamenti incrementali, che semplificano la gestione delle statistiche nella tabella.
Mantenere statistiche aggiornate nella tabella
Il monitoraggio e la gestione delle statistiche delle tabelle sono importanti per le prestazioni delle query nel database. Sono inclusi anche scenari in cui sono presenti carichi incrementali. PostgreSQL usa il processo del daemon autovacuum per pulire le tuple inattive e analizzare le tabelle per mantenere aggiornate le statistiche. Per altre informazioni, vedere Monitoraggio e ottimizzazione di Autovacuum.
Creare indici su vincoli di chiave esterna
La creazione di indici in chiavi esterne nelle tabelle figlio può essere utile negli scenari seguenti:
- Aggiornamenti o eliminazioni dei dati nella tabella padre. Quando i dati vengono aggiornati o eliminati nella tabella padre, le ricerche vengono eseguite nella tabella figlio. È possibile indicizzare le chiavi esterne nella tabella figlio per velocizzare le ricerche.
- Query, in cui è possibile visualizzare tabelle padre e figlio unite in join sulle colonne chiave.
Identificare gli indici inutilizzati
Identificare gli indici inutilizzati nel database e rilasciarli. Gli indici sono un sovraccarico sui caricamenti dei dati. Minore è il numero di indici in una tabella, migliori sono le prestazioni durante l'inserimento dei dati.
È possibile identificare gli indici inutilizzati in due modi: da Query Store e da una query sull'utilizzo dell'indice.
Archivio query
La funzionalità Query Store consente di identificare gli indici che possono essere eliminati in base ai modelli di utilizzo delle query nel database. Per istruzioni dettagliate, vedere Query Store.
Dopo aver abilitato Query Store nel server, è possibile usare la query seguente per identificare gli indici che possono essere eliminati connettendosi al database azure_sys.
SELECT * FROM IntelligentPerformance.DropIndexRecommendations;
Utilizzo indice
È anche possibile usare la query seguente per identificare gli indici inutilizzati:
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;
Le colonne number_of_scans
, tuples_read
e tuples_fetched
indicano il valore di colonna usage.number_of_scans di zero punti come indice non utilizzato.
Regolazione del parametro server
Nota
Seguire le indicazioni nei parametri seguenti solo se sono disponibili memoria e spazio su disco sufficienti.
maintenance_work_mem
: questo parametro può essere impostato su un massimo di 2 GB nell'istanza del server flessibile di Database di Azure per PostgreSQL.maintenance_work_mem
consente di velocizzare la creazione dell'indice e le aggiunte di chiavi esterne.checkpoint_timeout
: in un'istanza del server flessibile di Database di Azure per PostgreSQL il valorecheckpoint_timeout
può essere aumentato fino a 10-15 minuti dall'impostazione predefinita di 5 minuti. L'aumentocheckpoint_timeout
a un valore più significativo, ad esempio 15 minuti, può ridurre il carico di I/O, ma lo svantaggio è che il ripristino richiede più tempo in caso di arresto anomalo. È consigliabile prestare attenzione prima di apportare la modifica.checkpoint_completion_target
: è consigliabile usare il valore 0,9.max_wal_size
: questo valore dipende da SKU, archiviazione e carico di lavoro. Nell'esempio seguente viene illustrato un modo per arrivare al valore corretto permax_wal_size
.
Durante le ore lavorative di punta, arrivare a un valore eseguendo le operazioni seguenti:
a. Accettare il numero di sequenza di log (LSN) corrente eseguendo la query seguente:
SELECT pg_current_wal_lsn ();
b. Attendere il checkpoint_timeout
numero di secondi. Accettare l'LSN WAL corrente eseguendo la query seguente:
SELECT pg_current_wal_lsn ();
c. Usare i due risultati per verificare la differenza in GB:
SELECT round (pg_wal_lsn_diff('LSN value when running the second time','LSN value when run the first time')/1024/1024/1024,2) WAL_CHANGE_GB;
wal_compression
: può essere attivato. L'abilitazione di questo parametro può comportare un costo aggiuntivo della CPU per la compressione durante la registrazione wal e la decompressione durante la riproduzione wal.
Contenuto correlato
- Risolvere i problemi di utilizzo elevato della CPU in Database di Azure per PostgreSQL - Server flessibile.
- Risolvere i problemi di utilizzo elevato della memoria in Database di Azure per PostgreSQL - Server flessibile.
- Risolvere i problemi e identificare le query a esecuzione lenta in Database di Azure per PostgreSQL - Server flessibile.
- Parametri del server in Database di Azure per PostgreSQL - Server flessibile.
- Ottimizzazione automatica in Database di Azure per PostgreSQL - Server flessibile.