Caso de uso 2 — Incompatibilidade de tipos de dados - AWS Orientação prescritiva

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Caso de uso 2 — Incompatibilidade de tipos de dados

Escolher o tipo de dados adequado com base nos dados ajuda a fornecer o equilíbrio ideal entre tamanho e desempenho do armazenamento.

O exemplo de consulta a seguir usa a pnr_number coluna para unir duas tabelas. A pnr_number coluna tem tipos de dados diferentes em tabelas diferentes.

Nome da tabela

Nome da coluna e tipo de dados

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 você executaEXPLAIN ANALYZE, o planejador usa uma varredura de sequência ativada em rnr_segment_pax vez de uma varredura de índice, mesmo que as colunas usadas na junção tenham índices. O planejador não está usando uma varredura de índice porque as colunas usadas na junção têm comprimentos diferentes.

Altere as colunas da tabela para manter o mesmo tipo de dados para as duas tabelas envolvidas na condição de junção e, em seguida, analise a tabela:

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

Agora, as tabelas têm o mesmo comprimento nas duas colunas usadas na condição de junção.

Execute EXPLAIN ANALYZE novamente. O planejador executa uma varredura de índice, o que melhora significativamente o desempenho da consulta.

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