Localización rápida de las tablas que causan sesgo de datos
Actualmente, se proporcionan las siguientes API de consulta de sesgo: table_distribution(schemaname text, tablename text), table_distribution() y PGXC_GET_TABLE_SKEWNESS. Puede seleccionar una función según los requisitos de servicio.
Escenario 1: Sesgo de datos causado por un disco lleno
Primero, utilice la función pg_stat_get_last_data_changed_time(oid) para consultar las tablas cuyos datos han cambiado recientemente. La última hora de cambio de una tabla se registra solo en el CN donde se realizan las operaciones INSERT, UPDATE y DELETE. Debe consultar las tablas que se han modificado en el último día (el período se puede cambiar en la función).
CREATE OR REPLACE FUNCTION get_last_changed_table(OUT schemaname text, OUT relname text)
RETURNS setof record
AS $$
DECLARE
row_data record;
row_name record;
query_str text;
query_str_nodes text;
BEGIN
query_str_nodes := 'SELECT node_name FROM pgxc_node where node_type = ''C''';
FOR row_name IN EXECUTE(query_str_nodes) LOOP
query_str := 'EXECUTE DIRECT ON (' || row_name.node_name || ') ''SELECT b.nspname,a.relname FROM pg_class a INNER JOIN pg_namespace b on a.relnamespace = b.oid where pg_stat_get_last_data_changed_time(a.oid) BETWEEN current_timestamp - 1 AND current_timestamp;''';
FOR row_data IN EXECUTE(query_str) LOOP
schemaname = row_data.nspname;
relname = row_data.relname;
return next;
END LOOP;
END LOOP;
return;
END; $$
LANGUAGE plpgsql; A continuación, ejecute la función table_distribution(schemaname text, tablename text) para consultar el espacio de almacenamiento ocupado por las tablas en cada DN.
1 | SELECT table_distribution(schemaname,relname) FROM get_last_changed_table(); |
Escenario 2: Inspección de sesgo de datos de rutina
- Si la cantidad de tablas en la base de datos es inferior a 10,000, utilice la vista de sesgo para consultar el sesgo de datos de todas las tablas de la base de datos.
1SELECT * FROM pgxc_get_table_skewness ORDER BY totalsize DESC;
- Si la cantidad de tablas en la base de datos no es inferior a 10,000, se recomienda utilizar la función table_distribution() en lugar de la vista PGXC_GET_TABLE_SKEWNESS porque la vista tarda más tiempo (horas) debido a la consulta de toda la base de datos para las columnas de sesgo. Cuando utilice la función table_distribution(), puede definir la salida basada en PGXC_GET_TABLE_SKEWNESS, optimizando el cálculo y reduciendo las columnas de salida. Por ejemplo:
1 2 3 4 5 6
SELECT schemaname,tablename,max(dnsize) AS maxsize, min(dnsize) AS minsize FROM pg_catalog.pg_class c INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace INNER JOIN pg_catalog.table_distribution() s ON s.schemaname = n.nspname AND s.tablename = c.relname INNER JOIN pg_catalog.pgxc_class x ON c.oid = x.pcrelid AND x.pclocatortype = 'H' GROUP BY schemaname,tablename;
Escenario 3: Consulta del sesgo de datos de una tabla
Ejecute la siguiente sentencia SQL para consultar el sesgo de datos de una tabla. Reemplace table_name con el nombre real de la tabla.
1 | SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM table_name GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc; |
A continuación se muestra un ejemplo de la información devuelta. Si la desviación de la distribución de datos en cada DN es inferior al 10 %, los datos se distribuyen uniformemente. Si es superior al 10 %, se produce un sesgo de datos.
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc; count | node_name ------+----------- 11010 | datanode4 10000 | datanode3 12001 | datanode2 8995 | datanode1 10000 | datanode5 7999 | datanode6 9995 | datanode7 10000 | datanode8 (8 rows) |