Caso d'uso 2: mancata corrispondenza del tipo di dati - AWS Guida prescrittiva

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Caso d'uso 2: mancata corrispondenza del tipo di dati

La scelta del tipo di dati corretto in base ai dati aiuta a fornire l'equilibrio ottimale tra dimensioni di archiviazione e prestazioni.

La seguente query di esempio utilizza la pnr_number colonna per unire due tabelle. La pnr_number colonna contiene diversi tipi di dati in tabelle diverse.

Nome della tabella

Nome della colonna e tipo di dati

perf_user.rnr_segment_pax

pnr_number character varying(6)

perf_user.rnr_expiry_date

pnr_number character(2)

EXPLAIN ANALYZE UPDATE perf_user.RNR_SEGMENT_PAX x SET ARC_EXPIRY_DATE = y.ARC_EXPIRY_DATE FROM (SELECT AIRLINE_IATA_CODE, PNR_NUMBER, ARC_EXPIRY_DATE, 0+row_num ROW_NUM FROM perf_user.RNR_EXPIRY_DATE WHERE airline_iata_code = 'XX' AND row_num BETWEEN (1*5000)+0 AND (1+1)*5000) y WHERE x.airline_iata_code = y.airline_iata_code AND x.PNR_NUMBER =y.PNR_NUMBER; ----------------------------------------------------------------------------------------------- Update on rnr_segment_pax x (cost=290.97..1104986.32 rows=15515 width=460) (actual time=14574.118..14574.120 rows=0 loops=1) -> Hash Join (cost=290.97..1104986.32 rows=15515 width=460) (actual time=16.967..14101.983 rows=11953 loops=1) Hash Cond: ((x.pnr_number)::text = (rnr_expiry_date.pnr_number)::text) -> Seq Scan on rnr_segment_pax x (cost=0.00..954539.00 rows=40000320 width=446) (actual time=0.011..9702.989 rows=40000000 loops=1) Filter: ((airline_iata_code)::bpchar = 'XX'::bpchar) -> Hash (cost=225.37..225.37 rows=5248 width=24) (actual time=16.540..16.541 rows=5001 loops=1) Buckets: 8192 Batches: 1 Memory Usage: 338kB -> Index Scan using rnr_expiry_date_idx1 on rnr_expiry_date (cost=0.29..225.37 rows=5248 width=24) (actual time=3.102..15.331 rows=5001 loops=1) Index Cond: ((row_num >= 5000) AND (row_num <= 10000)) Filter: (airline_iata_code = 'XX'::bpchar) Planning Time: 4.445 ms Execution Time: 14574.322 ms

Quando si esegueEXPLAIN ANALYZE, il planner utilizza una scansione della sequenza rnr_segment_pax anziché una scansione dell'indice, anche se le colonne utilizzate nel join dispongono di indici. Il planner non utilizza una scansione dell'indice perché le colonne utilizzate nell'unione hanno lunghezze diverse.

Modifica le colonne della tabella per mantenere lo stesso tipo di dati per entrambe le tabelle coinvolte nella condizione di unione, quindi analizza la tabella:

alter table perf_user.rnr_expiry_date alter column airline_iata_code type character varying(6) ; analyze perf_user.rnr_expiry_date;

Ora le tabelle hanno la stessa lunghezza su entrambe le colonne utilizzate nella condizione di unione.

Eseguire nuovamente EXPLAIN ANALYZE. Il planner esegue una scansione dell'indice, che migliora in modo significativo le prestazioni delle query.

Update on rnr_segment_pax x (cost=0.86..59733.09 rows=14637 width=460) (actual time=416.653..416.654 rows=0 loops=1) -> Nested Loop (cost=0.86..59733.09 rows=14637 width=460) (actual time=0.103..91.106 rows=11953 loops=1) -> Index Scan using rnr_expiry_date_idx1 on rnr_expiry_date (cost=0.29..212.69 rows=4951 width=24) (actual time=0.025..3.023 rows=5001 loops=1) Index Cond: ((row_num >= 5000) AND (row_num <= 10000)) Filter: ((airline_iata_code)::text = 'XX'::text) -> Index Scan using rnr_segment_pax_pk on rnr_segment_pax x (cost=0.56..11.99 rows=3 width=446) (actual time=0.014..0.016 rows=2 loops=5001) Index Cond: (((airline_iata_code)::text = 'XX'::text) AND ((pnr_number)::text = (rnr_expiry_date.pnr_number)::text)) Planning Time: 0.310 ms Execution Time: 416.696 ms