Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Caso de uso 1: Colaciones
En una base de datos, una intercalación es un conjunto de reglas para determinar cómo se clasifican y comparan los datos. Por lo general, se aplica una intercalación a la forma en que se ordenan los datos de texto en diferentes idiomas para indexarlos y hacer comparaciones entre valores de texto. Los distintos idiomas tienen conjuntos de caracteres y un orden diferentes. Con una intercalación, puede ordenar los datos de caracteres de un idioma determinado mediante reglas que definen la secuencia de caracteres correcta. También puede especificar lo siguiente:
-
Distingue mayúsculas
-
Marcas de acento
-
Tipos de caracteres kana
-
Uso de símbolos o signos de puntuación
-
Ancho de caracteres
-
Clasificación de palabras
Es posible que el rendimiento se vea afectado si la columna de unión usa una intercalación diferente. En la siguiente consulta de ejemplo, se utilizan tres tablas, con una intercalación diferente para la columna de unión.
Nombre de la tabla |
Nombre de la columna |
|
|
|
|
|
|
EXPLAIN ANALYZE SELECT A.PNR_NUMBER, A.PAX_ID, A.SEGMENT_ID, B.OANDD_ID, C.SEAT_ID, C.BD_AIRPORT_CODE, C.OFF_AIRPORT_CODE, C.SEAT_NUMBER , B.CABIN_CLASS , A.SEGMENT_PAX_ID, C.SEAT_ALLOC_ID, C.SSR_ID, C.SEAT_ATTRIBUTE_CODE from RNR_SEGMENT_PAX A, RNR_SEGMENT B, RNR_SEAT_NUMBERS C where B.AIRLINE_IATA_CODE = 'XX' and B.FLIGHT_CARRIER = 'XX' and B.FLIGHT_NUMBER = 140 and B.FLIGHT_SUFFIX ='*' and B.FLIGHT_DATE_LTC = TO_DATE('01-JAN-2023', 'DD-MON-YYYY') and A.AIRLINE_IATA_CODE = B.AIRLINE_IATA_CODE and A.PNR_NUMBER = B.PNR_NUMBER and A.SEGMENT_ID = B.SEGMENT_ID and C.AIRLINE_IATA_CODE = B.AIRLINE_IATA_CODE and C.PNR_NUMBER = B.PNR_NUMBER and C.SEGMENT_ID = B.SEGMENT_ID and A.PAX_ID = C.PAX_ID and B.PNR_NUMBER in ('9F1588','E37DE0','04E82B','813D11','BFF10F');
El plan de consulta de la consulta anterior utiliza un escaneo secuencial de la rnr_seat_numbers
tabla, aunque esa tabla tenga un índice adecuado en las columnas unidas. El planificador no utiliza un escaneo de índices porque estas columnas unidas utilizan intercalaciones diferentes:
Nested Loop (cost=1112.14..927363.51 rows=1 width=833) (actual time=5395.367..5397.253 rows=0 loops=1) Join Filter: (((b.pnr_number)::text = (a.pnr_number)::text) AND (b.segment_id = a.segment_id)) -> Gather (cost=1111.58..670766.48 rows=1 width=843) (actual time=5395.367..5397.251 rows=0 loops=1) Workers Planned: 2 Workers Launched: 2 -> Hash Join (cost=111.58..669766.38 rows=1 width=843) (actual time=5388.992..5388.993 rows=0 loops=3) Hash Cond: (((c.pnr_number)::text = (b.pnr_number)::text) AND (c.segment_id = b.segment_id)) -> Parallel Seq Scan on rnr_seat_numbers c (cost=0.00..582154.96 rows=16666637 width=760) (actual time=0.008..2963.019 rows=13333333 loops=3) Filter: ((airline_iata_code)::text = 'XX'::text) -> Hash (cost=111.52..111.52 rows=4 width=86) (actual time=0.121..0.121 rows=2 loops=3) Buckets: 1024 Batches: 1 Memory Usage: 9kB -> Index Scan using rnr_segment_pk on rnr_segment b (cost=0.56..111.52 rows=4 width=86) (actual time=0.082..0.116 rows=2 loops=3) Index Cond: (((pnr_number)::text = ANY ('{9F1588,E37DE0,04E82B,813D11,BFF10F}'::text[])) AND ((airline_iata_code)::text = 'XX'::text)) Filter: (((flight_carrier)::text = 'XX'::text) AND (flight_number = 140) AND ((flight_suffix)::text = '*'::text) AND (flight_date_ltc = to_date('01-JAN-2023'::text, 'DD-MON-YYYY'::text))) Rows Removed by Filter: 20 -> Index Scan using rnr_segment_pax_pk on rnr_segment_pax a (cost=0.56..256597.02 rows=1 width=28) (never executed) Index Cond: (((airline_iata_code)::text = 'XX'::text) AND (segment_id = c.segment_id) AND (pax_id = c.pax_id)) Filter: ((c.pnr_number)::text = (pnr_number)::text) Planning Time: 0.982 ms Execution Time: 5397.314 ms
Para cambiar la intercalación de columnas de la tabla del "C"
idioma a la intercalación predeterminada proporcionada por PostgreSQL, ejecute la siguiente alter
instrucción y, a continuación, analice la tabla:
alter table rnr_segment alter column pnr_number type character varying(15) COLLATE pg_catalog."default"; Analyze rnr_segment;
El plan de consultas ahora utiliza un análisis de índices y se reduce el tiempo de ejecución.
Nested Loop (cost=1.69..146.63 rows=1 width=833) (actual time=0.155..0.155 rows=0 loops=1) -> Nested Loop (cost=1.13..145.89 rows=1 width=111) (actual time=0.154..0.155 rows=0 loops=1) -> Index Scan using rnr_segment_pk on rnr_segment b (cost=0.56..111.51 rows=4 width=86) (actual time=0.048..0.097 rows=2 loops=1) Index Cond: (((pnr_number)::text = ANY ('{9F1588,E37DE0,04E82B,813D11,BFF10F}'::text[])) AND ((airline_iata_code)::text = 'XX'::text)) Filter: (((flight_carrier)::text = 'XX'::text) AND (flight_number = 140) AND ((flight_suffix)::text = '*'::text) AND (flight_date_ltc = to_date('01-JAN-2023'::text, 'DD-MON-YYYY'::text))) Rows Removed by Filter: 20 -> Index Scan using rnr_segment_pax_pk on rnr_segment_pax a (cost=0.56..8.58 rows=1 width=28) (actual time=0.027..0.027 rows=0 loops=2) Index Cond: (((airline_iata_code)::text = 'XX'::text) AND ((pnr_number)::text = (b.pnr_number)::text) AND (segment_id = b.segment_id)) -> Index Scan using rnr_seat_numbers_pk on rnr_seat_numbers c (cost=0.56..0.72 rows=1 width=760) (never executed) Index Cond: (((pnr_number)::text = (a.pnr_number)::text) AND (segment_id = a.segment_id) AND (pax_id = a.pax_id) AND ((airline_iata_code)::text = 'XX'::text)) Planning Time: 1.432 ms Execution Time: 0.207 ms