Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2024-05-09 GMT+08:00

Localização rápida das tabelas que causam distorção de dados

Atualmente, as seguintes APIs de consulta são fornecidas:table_distribution(schemaname text, tablename text), table_distribution() e PGXC_GET_TABLE_SKEWNESS. Você pode selecionar uma com base nos requisitos do serviço.

Cenário 1: distorção de dados causado por um disco cheio

Primeiro, use a função pg_stat_get_last_data_changed_time(oid) para consultar as tabelas cujos dados foram alterados recentemente. O último tempo de mudança de uma tabela é registrado apenas no CN onde as operações INSERT, UPDATE e DELETE são executadas. Portanto, você precisa consultar tabelas que são alteradas no último dia (o período pode ser alterado na função).

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;

Em seguida, execute a função table_distribution(schemaname text, tablename text) para consultar o espaço de armazenamento ocupado pelas tabelas em cada DN.

1
SELECT table_distribution(schemaname,relname) FROM get_last_changed_table();

Cenário 2: inspeção de distorção de dados de rotina

  • Se o número de tabelas no banco de dados for menor que 10.000 use a exibição PGXC_GET_TABLE_SKEWNESS para consultar a distorção de dados de todas as tabelas no banco de dados.
    1
    SELECT * FROM pgxc_get_table_skewness ORDER BY totalsize DESC;
    
  • Se o número de tabelas no banco de dados não for menor que 10.000 é aconselhável usar a função table_distribution() em vez da exibição PGXC_GET_TABLE_SKEWNESS porque a exibição leva mais tempo (horas) devido à consulta de todo o banco de dados para colunas distorcidas. Quando você usa a função table_distribution(), você pode definir a saída baseada em PGXC_GET_TABLE_SKEWNESS, otimizando o cálculo e reduzindo as colunas de saída. Por exemplo:
    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;
    

Cenário 3: consultar distorção de dados de uma tabela

Execute a seguinte instrução SQL para consultar a distorção de dados de uma tabela. Substitua table_name pelo nome real da tabela.

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;

Segue-se um exemplo das informações retornadas. Se o desvio de distribuição de dados em cada DN for inferior a 10%, os dados serão distribuídos uniformemente. Se for maior que 10%, ocorrerá uma distorção de dados.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
gaussdb=>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)