Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Come posso risolvere i problemi relativi all'utilizzo elevato o completo del disco in Amazon Redshift?
Ho riscontrato un utilizzo elevato o completo del disco in Amazon Redshift e desidero risolvere questo problema.
Risoluzione
Per risolvere i problemi di utilizzo elevato o completo del disco in Amazon Redshift, segui questi passaggi.
Chiave di distribuzione e ordinamento
Rivedi lo stile di distribuzione, la chiave di distribuzione e la selezione della chiave di ordinamento della tabella. Le tabelle con distribuzione asimmetrica potrebbero causare un nodo con disco completo. Se hai tabelle con stili di distribuzione asimmetrici, modifica lo stile di distribuzione con una distribuzione più uniforme. La distribuzione e l'asimmetria delle righe potrebbero influire sull'asimmetria dell'archiviazione e sul set di righe intermedio durante l'esecuzione di una query.
Per determinare la cardinalità della chiave di distribuzione, esegui questa query:
SELECT <distkey column>, COUNT(*) FROM <schema name>.<table with distribution skew> GROUP BY <distkey column> HAVING COUNT(*) > 1 ORDER BY 2 DESC;
Nota: sostituisci distkey column, schema name e table with distribution skew on le variabili delle tue tabelle.
Per evitare una fase di ordinamento, utilizza le colonne SORT KEY nella clausola ORDER BY. Una fase di ordinamento potrebbe utilizzare una quantità eccessiva di memoria e causare un riversamento su disco (spill to disk). Per ulteriori informazioni, consulta Chiavi di ordinamento.
Nel gruppo filtrato di risultati, scegli una colonna con un'alta cardinalità per visualizzarne la distribuzione dei dati. Per ulteriori informazioni, consulta Scelta del migliore stile di distribuzione.
Elaborazione delle query
Rivedi l'eventuale memoria allocata per le query. I risultati delle query intermedie possono essere archiviati in blocchi temporanei durante l'elaborazione. Se la memoria libera non è sufficiente, le tabelle causano un riversamento su disco. I set di risultati intermedi non vengono compressi, il che influisce sullo spazio disponibile su disco. Per ulteriori informazioni, consulta Memoria allocata insufficiente alla query.
Per impostazione predefinita, Amazon Redshift utilizza una struttura di tabelle con distribuzione uniforme senza codifica delle colonne per le tabelle temporanee. Se utilizzi la sintassi SELECT...INTO, utilizzare un'istruzione CREATE. Per ulteriori informazioni, consulta Tip #6 (Suggerimento 6) in Top 10 performance tuning techniques for Amazon Redshift (Le 10 tecniche principali per l'ottimizzazione delle prestazioni di Amazon Redshift).
Se la memoria allocata alla query è insufficiente, potresti vedere una fase in SVL_QUERY_SUMMARY dove is_diskbased mostra il valore true. La seguente query identifica le 20 query principali con riversamento su disco in un arco di tempo specificato:
SELECT q.userid, q.query, q.starttime, q.endtime, m.query_temp_blocks_to_disk, btrim(querytxt) FROM stl_query q JOIN SVL_QUERY_METRICS_SUMMARY m ON m.query = q.query WHERE m.query_temp_blocks_to_disk > 0 AND starttime BETWEEN '2025-01-01 00:00:00' AND '2025-01-02 00:00:00' ORDER BY m.query_temp_blocks_to_disk DESC LIMIT 20;
Per risolvere il problema, aumenta il numero di slot per le query in modo da allocare più memoria alla query.
Se noti un improvviso aumento dell'utilizzo, esegui questa query per identificare le 20 query principali con riversamento su disco:
SELECT a.userid, a.query, a.blocks_to_disk, trim(b.text) as text FROM stv_query_metrics a, stv_inflight b WHERE a.query = b.query AND a.segment = -1 AND a.step_type = -1 AND a.max_blocks_to_disk > 0 ORDER BY 3 DESC LIMIT 20;
Nell'output, esegui una query per visualizzare il valore della colonna blocks_to_disk e identificare i riversamenti su disco. Termina le query che generano un riversamento eccessivo, quindi assegna più memoria alle query prima di eseguirle nuovamente.
Puoi inoltre utilizzare le regole di monitoraggio delle query WLM per contrastare carichi di processo pesanti e identificare le query ad alta intensità di I/O.
Tabelle con colonne VARCHAR(MAX)
Controlla se sono presenti spazi vuoti finali nelle colonne VARCHAR o CHARACTER VARYING che potrebbero essere omessi quando i dati vengono archiviati sul disco. Durante l'elaborazione delle query, gli spazi vuoti finali possono occupare l'intera lunghezza della memoria. Il valore massimo per VARCHAR e CHARACTER VARYING è 65.535 byte. È consigliabile utilizzare le dimensioni della colonna più piccole possibile.
Per generare un elenco di tabelle con la larghezza massima delle colonne, esegui questa query:
SELECT database, schema || '.' || "table" AS "table", max_varchar FROM svv_table_info WHERE max_varchar > 150 ORDER BY 2;
Esegui questa query per identificare e visualizzare le larghezze effettive delle colonne larghe della tabella VARCHAR:
SELECT max(octet_length (rtrim(column_name))) FROM table_name;
Nell'output della query, verifica che la lunghezza sia adatta al caso d'uso. Se le colonne hanno una lunghezza massima e superano le esigenze, regolane la lunghezza in base alla dimensione minima necessaria.
Per ulteriori informazioni, consulta Best practice di Amazon Redshift per la progettazione di tabelle.
Compressione elevata delle colonne
Per codificare tutte le colonne tranne la chiave di ordinamento, utilizza ANALYZE COMPRESSION o l'ottimizzazione automatica della tabella. È consigliabile utilizzare la codifica delle colonne.
Operazioni di manutenzione
Assicurati di analizzare e pulire regolarmente le tabelle del database Amazon Redshift. Identifica tutte le query eseguite su tabelle prive di statistiche. Quindi blocca l'esecuzione di query su tabelle prive di statistiche in modo che Amazon Redshift non esegua la scansione delle righe di tabella non necessarie.
Nota: le operazioni di manutenzione come VACUUM e DEEP COPY utilizzano spazio di archiviazione temporaneo per le operazioni di ordinamento e potrebbero causare un picco nell'utilizzo del disco.
Ad esempio, la seguente query identifica statistiche obsolete in Amazon Redshift:
SELECT table_id, database, schema, "table", stats_off, size FROM svv_table_info WHERE stats_off > 10 ORDER BY size DESC;
Inoltre, utilizza il comando ANALYZE per visualizzare e analizzare le statistiche delle tabelle.
Prodotti cartesiani con cross join
Utilizza il piano EXPLAIN della query per cercare le query con prodotti cartesiani. I prodotti cartesiani sono cross join non correlati e potrebbero produrre un maggior numero di blocchi. I cross join potrebbero comportare un maggiore utilizzo della memoria e il riversamento di più tabelle su disco. Se i cross join non condividono una condizione JOIN, producono un prodotto cartesiano di due tabelle. Ogni riga di una tabella si unisce a ogni riga dell'altra tabella.
I cross join possono essere eseguiti anche come loop join nidificati e allungare tempi di processo. I loop join nidificati provocano picchi nell'utilizzo complessivo del disco. Per ulteriori informazioni, consulta Identificazione di query con loop nidificati.
Dimensioni minime della tabella
Le singole tabelle possono avere dimensioni diverse in cluster diversi. La dimensione minima della tabella dipende dal numero di colonne, dalla presenza di una chiave di ordinamento (** SORTKEY**) e dal numero di sezioni popolate. Se di recente hai ridimensionato un cluster Amazon Redshift, potresti notare una modifica nell'archiviazione su disco complessiva causata dalla modifica delle sezioni. Amazon Redshift conta anche i segmenti di tabella utilizzati da ciascuna tabella. Per ulteriori informazioni, consulta Qual è il motivo per cui una tabella in un cluster con provisioning Amazon Redshift consuma più o meno spazio di archiviazione su disco del previsto?
Blocchi tombstone
I blocchi tombstone vengono generati quando si verifica una transazione WRITE su una tabella Amazon Redshift e viene eseguita un'operazione di lettura concorrente. Amazon Redshift mantiene i blocchi prima dell'operazione di scrittura in modo che l'operazione di lettura concorrente sia coerente. Non puoi modificare i blocchi di Amazon Redshift. Ogni azione Inserisci, Aggiorna o Elimina crea un nuovo gruppo di blocchi, contrassegnando i vecchi blocchi come obsoleti.
A volte i blocchi tombstone non vengono eliminati nella fase di commit se vengono eseguite transazioni di lunga durata sulle tabelle. I blocchi tombstone possono anche non venire eliminati quando sono presenti troppi carichi ETL eseguiti contemporaneamente. Poiché Amazon Redshift monitora il database dal momento in cui inizia la transazione, qualsiasi tabella scritta nel database mantiene anche i blocchi tombstone. Se le transazioni di lunga durata si verificano regolarmente e su diversi carichi, è possibile che si accumuli un numero di blocchi tombstone tale da provocare un errore "Disk Full".
Se sono attive query di lunga durata, esegui il comando commit per terminare le query e rilasciare tutti i blocchi successivi:
begin; create table a (id int); insert into a values(1); commit; drop table a;
Esegui questa query per verificare i blocchi tombstone:
SELECT trim(name) as tablename, count(case when tombstone > 0 then 1 else null end) as tombstones FROM svv_diskusage GROUP BY 1 HAVING count(case when tombstone > 0 then 1 else null end) > 0 ORDER BY 2 DESC;
Copia un file di grandi dimensioni
Un'operazione COPY potrebbe ricevere un errore "Disk Full"anche se è disponibile spazio di archiviazione sufficiente. L'errore si verifica se l'operazione di ordinamento si riversa sul disco e crea blocchi temporanei.
Se riscontri un errore "Disk Full", controlla la tabella STL_DISK_FULL_DIAG. Controlla i blocchi temporanei e l'ID della query che ha causato l'errore:
SELECT '2000-01-01'::timestamp + (currenttime/1000000.0)* interval '1 second' as currenttime, node_num, query_id, temp_blocks FROM stl_disk_full_diag;
Per ulteriori informazioni, consulta Best practice di Amazon Redshift per il caricamento di dati.
Blocchi di query di condivisione dati su cluster consumer
Quando una query di condivisione dati viene eseguita sul cluster consumer, i blocchi di dati associati alla query vengono conteggiati nelle metriche PercentageDiskSpaceUsed. Questi blocchi di dati vengono rimossi dalle metriche PercentageDiskSpaceUsed in caso di riavvio del cluster o per altri fattori. Si tratta di un comportamento normale che non richiede ulteriori azioni.
Controlla lo spazio su disco
Controlla la percentuale di spazio su disco nella scheda Prestazioni della console Amazon Redshift.
Informazioni correlate
- Argomenti
- Analytics
- Lingua
- Italiano
