Ejemplos de distribución
En los siguientes ejemplos, se muestra cómo se distribuyeron los datos según las opciones que definió en la instrucción CREATE TABLE.
Ejemplos de DISTKEY
Observe el esquema de la tabla USERS en la base de datos TICKIT. USERID se define como la columna SORTKEY y la columna DISTKEY:
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'users'; column | type | encoding | distkey | sortkey ---------------+------------------------+----------+---------+--------- userid | integer | none | t | 1 username | character(8) | none | f | 0 firstname | character varying(30) | text32k | f | 0 ...
USERID es una buena opción para la columna de distribución de esta tabla. Si consulta la vista de sistema SVV_DISKUSAGE, puede ver que la tabla está bien distribuida de manera uniforme. Los números de las columnas comienzan con cero, por lo que USERID es la columna 0.
select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name='users' and col=0 and rows>0 order by slice, col; slice| col | rows | minvalue | maxvalue -----+-----+-------+----------+---------- 0 | 0 | 12496 | 4 | 49987 1 | 0 | 12498 | 1 | 49988 2 | 0 | 12497 | 2 | 49989 3 | 0 | 12499 | 3 | 49990 (4 rows)
La tabla tiene 49 990 filas. En la columna rows (num_values), se ve que cada sector tiene, aproximadamente, la misma cantidad de filas. En las columnas minvalue y maxvalue, se ve el rango de valores en cada sector. Cada sector incluye prácticamente todo el rango de valores, por lo que es muy probable que todos los sectores participen de la ejecución de una consulta que filtre en busca de un rango de ID de usuarios.
En este ejemplo, se muestra la distribución en un sistema pequeño de prueba. Por lo general, la cantidad total de sectores es mucho mayor.
Si suele hacer combinaciones o agrupaciones con la columna STATE, puede seleccionar distribuir en la columna STATE. En el siguiente ejemplo, se muestra un caso en el que se crea una tabla nueva con los mismos datos que la tabla USERS, pero se establece DISTKEY en la columna STATE. En este caso, la distribución no es tan uniforme. El sector 0 (13 587 filas) dispone, aproximadamente, de un 30 % más de filas que el sector 3 (10 150 filas). En una tabla mucho más grande, este nivel de sesgo de distribución puede tener un impacto negativo en el procesamiento de las consultas.
create table userskey distkey(state) as select * from users; select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name = 'userskey' and col=0 and rows>0 order by slice, col; slice | col | rows | minvalue | maxvalue ------+-----+-------+----------+---------- 0 | 0 | 13587 | 5 | 49989 1 | 0 | 11245 | 2 | 49990 2 | 0 | 15008 | 1 | 49976 3 | 0 | 10150 | 4 | 49986 (4 rows)
Ejemplo de DISTSTYLE EVEN
Si crea una nueva tabla con los mismos datos que la tabla USERS, pero configura DISTSTYLE como EVEN, las filas siempre se distribuyen de manera uniforme en todos los sectores.
create table userseven diststyle even as select * from users; select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name = 'userseven' and col=0 and rows>0 order by slice, col; slice | col | rows | minvalue | maxvalue ------+-----+-------+----------+---------- 0 | 0 | 12497 | 4 | 49990 1 | 0 | 12498 | 8 | 49984 2 | 0 | 12498 | 2 | 49988 3 | 0 | 12497 | 1 | 49989 (4 rows)
No obstante, como la distribución no está basada en una columna específica, el procesamiento de consultas puede empeorar, en especial si la tabla se combina con otras tablas. La falta de distribución en una columna de combinación suele influir en el rendimiento del tipo de operación de combinación por ejecutar. Las operaciones de combinación, agregación y agrupamiento están optimizadas cuando se distribuyen y ordenan ambas tablas en sus respectivas columnas de combinación.
Ejemplo de DISTSTYLE ALL
Si crea una tabla nueva con los mismos datos que la tabla USERS, pero configura DISTSTYLE como ALL, todas las filas se distribuyen al primer sector de cada nodo.
select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name = 'usersall' and col=0 and rows > 0 order by slice, col; slice | col | rows | minvalue | maxvalue ------+-----+-------+----------+---------- 0 | 0 | 49990 | 4 | 49990 2 | 0 | 49990 | 2 | 49990 (4 rows)