Parâmetros de servidor do Azure Cosmos DB for PostgreSQL

APLICA-SE A: Azure Cosmos DB para PostgreSQL (alimentado pela extensão de banco de dados Citus para PostgreSQL)

Há vários parâmetros de servidor que afetam o comportamento do Azure Cosmos DB para PostgreSQL, tanto do PostgreSQL padrão quanto específico do Azure Cosmos DB para PostgreSQL. Estes parâmetros podem ser definidos no portal do Azure de um cluster. Na categoria Definições, escolha os parâmetros do Nó de trabalho ou do Nó de coordenação. Estas páginas permitem definir os parâmetros de todos os nós de trabalho ou apenas do nó de coordenação.

Parâmetros do Azure Cosmos DB for PostgreSQL

Nota

Clusters que executam versões mais antigas da extensão Citus podem não oferecer todos os parâmetros listados abaixo.

Configuração geral

citus.use_secondary_nodes (enum)

Define a política a ser usada ao escolher nós para consultas SELECT. Se estiver definido como 'sempre', o planejador consultará apenas os nós marcados como 'secundários' no pg_dist_node.

Os valores suportados para esta enumeração são:

  • nunca (predefinição): todas as leituras ocorrem nos nós principais.
  • sempre: as leituras são feitas nos nós secundários e as instruções de inserção/atualização estão desativadas.

citus.cluster_name (texto)

Informa ao planejador de nó coordenador qual cluster ele coordena. Depois que cluster_name é definido, o planejador consulta nós de trabalho somente nesse cluster.

citus.enable_version_checks (booleano)

A atualização do Azure Cosmos DB para a versão PostgreSQL requer uma reinicialização do servidor (para pegar a nova biblioteca compartilhada), seguida pelo comando ALTER EXTENSION UPDATE. A falha na execução de ambas as etapas pode potencialmente causar erros ou falhas. Assim, o Azure Cosmos DB para PostgreSQL valida a versão do código e a da correspondência da extensão, e os erros são eliminados se não o fizerem.

Esse valor assume como padrão true e é efetivo no coordenador. Em casos raros, processos de atualização complexos podem exigir a definição desse parâmetro como false, desativando assim a verificação.

citus.log_distributed_deadlock_detection (booleano)

Se o processamento relacionado à deteção de deadlock distribuído deve ser registrado no log do servidor. O padrão é false.

citus.distributed_deadlock_detection_fator (ponto flutuante)

Define o tempo de espera antes de verificar se há bloqueios distribuídos. Em particular, o tempo de espera é esse valor multiplicado pela configuração deadlock_timeout do PostgreSQL. O valor predefinido é 2. Um valor de desabilita a deteção de -1 deadlock distribuído.

citus.node_connection_timeout (integer)

O citus.node_connection_timeout GUC define a duração máxima (em milissegundos) para aguardar o estabelecimento da conexão. O Azure Cosmos DB for PostgreSQL gerará um erro se o tempo limite terminar antes de ser estabelecida, pelo menos, uma ligação da função de trabalho. Este GUC afeta as ligações entre o nó de coordenação e as funções de trabalho e as funções de trabalho entre si.

  • Predefinição: cinco segundos
  • Mínimo: 10 milissegundos
  • Máximo: uma hora
-- set to 30 seconds
ALTER DATABASE foo
SET citus.node_connection_timeout = 30000;

citus.log_remote_commands (booleano)

Registre todos os comandos que o coordenador envia aos nós de trabalho. Por exemplo:

-- reveal the per-shard queries behind the scenes
SET citus.log_remote_commands TO on;

-- run a query on distributed table "github_users"
SELECT count(*) FROM github_users;

A saída revela várias consultas em execução nos trabalhadores devido à única count(*) consulta no coordenador.

NOTICE:  issuing SELECT count(*) AS count FROM public.github_events_102040 github_events WHERE true
DETAIL:  on server citus@private-c.demo.postgres.database.azure.com:5432 connectionId: 1
NOTICE:  issuing SELECT count(*) AS count FROM public.github_events_102041 github_events WHERE true
DETAIL:  on server citus@private-c.demo.postgres.database.azure.com:5432 connectionId: 1
NOTICE:  issuing SELECT count(*) AS count FROM public.github_events_102042 github_events WHERE true
DETAIL:  on server citus@private-c.demo.postgres.database.azure.com:5432 connectionId: 1
... etc, one for each of the 32 shards

citus.show_shards_for_app_name_prefixes (texto)

Por padrão, o Azure Cosmos DB para PostgreSQL oculta fragmentos da lista de tabelas que o PostgreSQL fornece aos clientes SQL. Ele faz isso porque há vários fragmentos por tabela distribuída, e os fragmentos podem distrair o cliente SQL.

O citus.show_shards_for_app_name_prefixes GUC permite que fragmentos sejam exibidos para clientes selecionados que desejam vê-los. Seu valor padrão é ''.

-- show shards to psql only (hide in other clients, like pgAdmin)

SET citus.show_shards_for_app_name_prefixes TO 'psql';

-- also accepts a comma separated list

SET citus.show_shards_for_app_name_prefixes TO 'psql,pg_dump';

A ocultação de estilhaços pode ser totalmente desativada usando citus.override_table_visibility.

citus.override_table_visibility (booleano)

Determina se citus.show_shards_for_app_name_prefixes está ativo. O valor padrão é 'true'. Quando definido como 'false', os fragmentos são visíveis para todos os aplicativos cliente.

citus.use_citus_managed_tables (booleano)

Permita que novas tabelas locais sejam acessadas por consultas em nós de trabalho. Adiciona todas as tabelas recém-criadas aos metadados do Citus quando habilitado. O valor padrão é 'false'.

citus.rebalancer_by_disk_size_base_cost (inteiro)

Usando a estratégia de reequilíbrio de by_disk_size, cada grupo de estilhaços obtém esse custo em bytes adicionados ao tamanho real do disco. Esse valor é usado para evitar a criação de um equilíbrio ruim quando há poucos dados em alguns dos fragmentos. A suposição é que mesmo os fragmentos vazios têm algum custo, por causa do paralelismo e porque os grupos de fragmentos vazios provavelmente crescerão no futuro.

O valor predefinido é 100MB.

Estatísticas de consulta

citus.stat_statements_purge_interval (inteiro)

Define a frequência com que o daemon de manutenção remove registros de citus_stat_statements que são incomparáveis no pg_stat_statements. Esse valor de configuração define o intervalo de tempo entre purgas em segundos, com um valor padrão de 10. Um valor de 0 desativa as purgas.

SET citus.stat_statements_purge_interval TO 5;

Este parâmetro é efetivo no coordenador e pode ser alterado em tempo de execução.

citus.stat_statements_max (integer)

O número máximo de linhas a armazenar em citus_stat_statements. O padrão é 50000 e pode ser alterado para qualquer valor no intervalo 1000 - 10000000. Cada linha requer 140 bytes de armazenamento, portanto, definir stat_statements_max para seu valor máximo de 10M consumiria 1,4 GB de memória.

A alteração deste GUC não terá efeito até que o PostgreSQL seja reiniciado.

citus.stat_statements_track (enum)

A gravação de estatísticas requer recursos extras da citus_stat_statements CPU. Quando o banco de dados estiver sendo carregado, o administrador poderá desabilitar o controle de instruções definindo citus.stat_statements_track como none.

  • all: (padrão) Acompanhe todas as instruções.
  • none: Desative o rastreamento.

citus.stat_tenants_untracked_sample_rate

Taxa de amostragem para novos inquilinos em citus_stat_tenants. A taxa pode variar entre 0.0 e 1.0. O padrão significa 1.0 que 100% das consultas de locatário não rastreadas são amostradas. Defini-lo para um valor mais baixo significa que os locatários já rastreados têm 100% de consultas amostradas, mas os locatários que não são rastreados no momento são amostrados apenas na taxa fornecida.

Carregamento de dados

citus.multi_shard_commit_protocol (enum)

Define o protocolo de consolidação a utilizar ao executar COPY numa tabela distribuída por hash. Em cada colocação de estilhaço individual, a COPY é executada em um bloco de transação para garantir que nenhum dado seja ingerido se ocorrer um erro durante a CÓPIA. No entanto, há um caso de falha específico em que o COPY é bem-sucedido em todos os posicionamentos, mas uma falha (de hardware) ocorre antes de todas as transações serem confirmadas. Esse parâmetro pode ser usado para evitar a perda de dados nesse caso, escolhendo entre os seguintes protocolos de confirmação:

  • 2pc: (padrão) As transações em que COPY é realizado nos posicionamentos de estilhaços são primeiro preparadas usando a confirmação de duas fases do PostgreSQL e, em seguida, confirmadas. As confirmações com falha podem ser recuperadas manualmente ou abortadas usando COMMIT PREPARED ou ROLLBACK PREPARED, respectivamente. Ao usar 2pc, max_prepared_transactions deve ser aumentada em todos os trabalhadores, normalmente para o mesmo valor que max_connections.
  • 1pc: As transações em que COPY é realizado nas colocações de estilhaços são cometidas em uma única rodada. Os dados podem ser perdidos se uma confirmação falhar depois que o COPY for bem-sucedido em todos os posicionamentos (raro).

citus.shard_replication_fator (inteiro)

Define o fator de replicação para fragmentos, ou seja, o número de nós nos quais os fragmentos são colocados e o padrão é 1. Este parâmetro pode ser definido em tempo de execução e é efetivo no coordenador. O valor ideal para este parâmetro depende do tamanho do cluster e da taxa de falha do nó. Por exemplo, você pode aumentar esse fator de replicação se executar clusters grandes e observar falhas de nó com mais frequência.

Configuração do Planejador

citus.local_table_join_policy (enum)

Este GUC determina como o Azure Cosmos DB para PostgreSQL move dados ao fazer uma junção entre tabelas locais e distribuídas. A personalização da política de associação pode ajudar a reduzir a quantidade de dados enviados entre nós de trabalho.

O Azure Cosmos DB para PostgreSQL envia as tabelas locais ou distribuídas para nós, conforme necessário para dar suporte à associação. A cópia de dados da tabela é chamada de "conversão". Se uma tabela local for convertida, ela será enviada para todos os trabalhadores que precisarem de seus dados para executar a associação. Se uma tabela distribuída for convertida, ela será coletada no coordenador para dar suporte à associação. O planejador do Azure Cosmos DB para PostgreSQL envia apenas as linhas necessárias fazendo uma conversão.

Há quatro modos disponíveis para expressar a preferência de conversão:

  • auto: (Padrão) O Azure Cosmos DB para PostgreSQL converte todas as tabelas locais ou todas as tabelas distribuídas para dar suporte a junções de tabelas locais e distribuídas. O Azure Cosmos DB para PostgreSQL decide qual converter usando uma heurística. Ele converte tabelas distribuídas se elas forem unidas usando um filtro constante em um índice exclusivo (como uma chave primária). A conversão garante que menos dados sejam movidos entre trabalhadores.
  • nunca: o Azure Cosmos DB para PostgreSQL não permite junções entre tabelas locais e distribuídas.
  • prefer-local: o Azure Cosmos DB para PostgreSQL prefere converter tabelas locais para dar suporte a junções de tabelas locais e distribuídas.
  • preferencialmente distribuído: o Azure Cosmos DB para PostgreSQL prefere converter tabelas distribuídas para dar suporte a junções de tabelas locais e distribuídas. Se as tabelas distribuídas forem enormes, usar essa opção pode resultar na movimentação de muitos dados entre os trabalhadores.

Por exemplo, suponha citus_table que é uma tabela distribuída pela coluna x, e que postgres_table é uma tabela local:

CREATE TABLE citus_table(x int primary key, y int);
SELECT create_distributed_table('citus_table', 'x');

CREATE TABLE postgres_table(x int, y int);

-- even though the join is on primary key, there isn't a constant filter
-- hence postgres_table will be sent to worker nodes to support the join
SELECT * FROM citus_table JOIN postgres_table USING (x);

-- there is a constant filter on a primary key, hence the filtered row
-- from the distributed table will be pulled to coordinator to support the join
SELECT * FROM citus_table JOIN postgres_table USING (x) WHERE citus_table.x = 10;

SET citus.local_table_join_policy to 'prefer-distributed';
-- since we prefer distributed tables, citus_table will be pulled to coordinator
-- to support the join. Note that citus_table can be huge.
SELECT * FROM citus_table JOIN postgres_table USING (x);

SET citus.local_table_join_policy to 'prefer-local';
-- even though there is a constant filter on primary key for citus_table
-- postgres_table will be sent to necessary workers because we are using 'prefer-local'.
SELECT * FROM citus_table JOIN postgres_table USING (x) WHERE citus_table.x = 10;

citus.limit_clause_row_fetch_count (inteiro)

Define o número de linhas a serem buscadas por tarefa para otimização da cláusula limite. Em alguns casos, consultas selecionadas com cláusulas de limite podem precisar buscar todas as linhas de cada tarefa para gerar resultados. Nesses casos, e quando uma aproximação produziria resultados significativos, esse valor de configuração define o número de linhas a serem buscadas em cada fragmento. As aproximações de limite são desabilitadas por padrão e esse parâmetro é definido como -1. Esse valor pode ser definido em tempo de execução e é efetivo no coordenador.

citus.count_distinct_error_rate (ponto flutuante)

O Azure Cosmos DB para PostgreSQL pode calcular aproximações count(distinct) usando a extensão postgresql-hll. Esta entrada de configuração define a taxa de erro desejada ao calcular count(distinct). 0,0, que é o padrão, desativa aproximações para contagem (distinto); e 1.0 não fornece garantias sobre a precisão dos resultados. Recomendamos definir esse parâmetro como 0,005 para obter melhores resultados. Esse valor pode ser definido em tempo de execução e é efetivo no coordenador.

citus.task_assignment_policy (enum)

Nota

Este GUC é aplicável apenas quando shard_replication_fator é maior que um, ou para consultas contra reference_tables.

Define a política a ser usada ao atribuir tarefas aos trabalhadores. O coordenador atribui tarefas aos trabalhadores com base nos locais de estilhaços. Esse valor de configuração especifica a política a ser usada ao fazer essas atribuições. Atualmente, há três políticas possíveis de atribuição de tarefas que podem ser usadas.

  • ganancioso: A política gananciosa é o padrão e visa distribuir uniformemente as tarefas entre os trabalhadores.
  • round-robin: A política de round-robin atribui tarefas aos trabalhadores de forma round-robin, alternando entre diferentes réplicas. Essa política permite uma melhor utilização do cluster quando a contagem de fragmentos de uma tabela é baixa em comparação com o número de trabalhadores.
  • primeira réplica: a política de primeira réplica atribui tarefas com base na ordem de inserção dos posicionamentos (réplicas) para os fragmentos. Em outras palavras, a consulta de fragmento para um fragmento é atribuída ao trabalhador que tem a primeira réplica desse fragmento. Esse método permite que você tenha fortes garantias sobre quais fragmentos são usados em quais nós (ou seja, garantias de residência de memória mais fortes).

Este parâmetro pode ser definido em tempo de execução e é efetivo no coordenador.

citus.enable_non_colocated_router_query_pushdown (booleano)

Habilita o planejador de roteador para as consultas que fazem referência a tabelas distribuídas não colocalizadas.

O planejador de roteador só está habilitado para consultas que fazem referência a tabelas distribuídas colocalizadas porque, caso contrário, os fragmentos podem não estar no mesmo nó. Habilitar esse sinalizador permite a otimização para consultas que fazem referência a essas tabelas, mas a consulta pode não funcionar depois de reequilibrar os fragmentos ou alterar a contagem de estilhaços dessas tabelas.

A predefinição é off.

Transferência de dados intermediária

citus.max_intermediate_result_size (inteiro)

O tamanho máximo em KB de resultados intermediários para CTEs que não podem ser empurrados para nós de trabalho para execução e para subconsultas complexas. O padrão é 1 GB, e um valor de -1 significa sem limite. As consultas que excedem o limite são canceladas e produzem uma mensagem de erro.

DDL

citus.enable_schema_based_sharding

Com o parâmetro definido como ON, todos os esquemas criados são distribuídos por padrão. Os esquemas distribuídos são automaticamente associados a grupos de colocation individuais, de modo que as tabelas criadas nesses esquemas são convertidas em tabelas distribuídas colocalizadas sem uma chave de estilhaço. Essa configuração pode ser modificada para sessões individuais.

Para obter um exemplo de como usar este GUC, consulte como projetar para microsserviço.

Configuração do Executor

Geral

citus.all_modifications_commutative

O Azure Cosmos DB para PostgreSQL impõe regras de comutatividade e adquire bloqueios apropriados para operações de modificação, a fim de garantir a correção do comportamento. Por exemplo, ele pressupõe que uma instrução INSERT se desloca com outra instrução INSERT, mas não com uma instrução UPDATE ou DELETE. Da mesma forma, ele pressupõe que uma instrução UPDATE ou DELETE não se comuta com outra instrução UPDATE ou DELETE. Essa precaução significa que UPDATEs e DELETEs exigem que o Azure Cosmos DB para PostgreSQL adquira bloqueios mais fortes.

Se você tiver instruções UPDATE que são comutativas com seus INSERTs ou outros UPDATEs, poderá relaxar essas suposições de comutatividade definindo esse parâmetro como true. Quando esse parâmetro é definido como true, todos os comandos são considerados comutativos e reivindicam um bloqueio compartilhado, o que pode melhorar a taxa de transferência geral. Este parâmetro pode ser definido em tempo de execução e é eficaz no coordenador.

citus.remote_task_check_interval (inteiro)

Define a frequência com que o Azure Cosmos DB para PostgreSQL verifica os status dos trabalhos gerenciados pelo executor do controlador de tarefas. O padrão é 10 ms. O coordenador atribui tarefas aos trabalhadores e, em seguida, verifica regularmente com eles o progresso de cada tarefa. Esse valor de configuração define o intervalo de tempo entre duas verificações consequentes. Este parâmetro é eficaz no coordenador e pode ser definido em tempo de execução.

citus.task_executor_type (enum)

O Azure Cosmos DB para PostgreSQL tem três tipos de executor para executar consultas SELECT distribuídas. O executor desejado pode ser selecionado definindo este parâmetro de configuração. Os valores aceites para este parâmetro são:

  • adaptive: O padrão. É ideal para respostas rápidas a consultas que envolvem agregações e junções colocalizadas que abrangem vários fragmentos.
  • task-tracker: O executor do task-tracker é adequado para consultas complexas e de longa execução que exigem embaralhamento de dados entre nós de trabalho e gerenciamento eficiente de recursos.
  • em tempo real: (preterido) Serve a um propósito semelhante ao do executor adaptativo, mas é menos flexível e pode causar mais pressão de conexão nos nós de trabalho.

Este parâmetro pode ser definido em tempo de execução e é efetivo no coordenador.

citus.multi_task_query_log_level (enum) {#multi_task_logging}

Define um nível de log para qualquer consulta que gere mais de uma tarefa (ou seja, que atinge mais de um fragmento). O registro em log é útil durante uma migração de aplicativo multilocatário, pois você pode optar por errar ou avisar para essas consultas, para localizá-las e adicionar um filtro de tenant_id a elas. Este parâmetro pode ser definido em tempo de execução e é eficaz no coordenador. O valor padrão para este parâmetro é 'off'.

Os valores suportados para esta enumeração são:

  • off: desative o registro de todas as consultas que geram várias tarefas (ou seja, abrangem vários fragmentos)
  • debug: Instrução Logs no nível de gravidade DEBUG.
  • log: Instrução Logs no nível de severidade LOG. A linha de log inclui a consulta SQL que foi executada.
  • notice: Registra a instrução no nível de severidade NOTICE.
  • warning: Registra a instrução no nível de severidade WARNING.
  • error: Registra a instrução no nível de gravidade ERROR.

Pode ser útil usá-lo durante os testes de desenvolvimento e um nível de log mais baixo, como log durante a error implantação da produção real. A escolha log fará com que as consultas multitarefa apareçam nos logs do banco de dados com a própria consulta mostrada após "STATEMENT".

LOG:  multi-task query about to be executed
HINT:  Queries are split to multiple tasks if they have to be split into several queries on the workers.
STATEMENT:  select * from foo;
citus.propagate_set_commands (enum)

Determina quais comandos SET são propagados do coordenador para os trabalhadores. O valor padrão para este parâmetro é 'none'.

Os valores suportados são:

  • nenhum: nenhum comando SET é propagado.
  • local: apenas os comandos SET LOCAL são propagados.
citus.create_object_propagation (enum)

Controla o comportamento de instruções CREATE em transações para objetos suportados.

Quando os objetos são criados em um bloco de transação de várias instruções, o Azure Cosmos DB para PostgreSQL alterna o modo sequencial para garantir que os objetos criados sejam visíveis para instruções posteriores em fragmentos. No entanto, a mudança para o modo sequencial nem sempre é desejável. Ao substituir esse comportamento, o usuário pode trocar o desempenho por total consistência transacional na criação de novos objetos.

O valor padrão para este parâmetro é 'imediato'.

Os valores suportados são:

  • imediato: gera erro em transações em que operações paralelas como create_distributed_table acontecem antes de uma tentativa de CREATE TYPE.
  • Automático: adiar a criação de tipos ao compartilhar uma transação com uma operação paralela em tabelas distribuídas. Pode haver alguma inconsistência entre quais objetos de banco de dados existem em nós diferentes.
  • diferido: retornar ao comportamento pré-11.0, que é como automático, mas com outros casos de canto sutis. Recomendamos a configuração automática sobre adiado, a menos que você exija compatibilidade com versões anteriores verdadeiras.

Para obter um exemplo deste GUC em ação, consulte propagação de tipo.

citus.enable_repartition_joins (booleano)

Normalmente, a tentativa de executar junções de repartição com o executor adaptável falha com uma mensagem de erro. No entanto, a configuração citus.enable_repartition_joins como true permite que o Azure Cosmos DB for PostgreSQL alterne temporariamente para o executor do controlador de tarefas para executar a junção. O valor predefinido é false.

citus.enable_repartitioned_insert_select (booleano)

Por padrão, um INSERT INTO ... A instrução SELECT que não pode ser empurrada para baixo tenta reparticionar linhas da instrução SELECT e transferi-las entre trabalhadores para inserção. No entanto, se a tabela de destino tiver muitos fragmentos, o reparticionamento provavelmente não terá um bom desempenho. A sobrecarga de processamento dos intervalos de estilhaços ao determinar como particionar os resultados é muito grande. O reparticionamento pode ser desativado manualmente definindo citus.enable_repartitioned_insert_select como false.

citus.enable_binary_protocol (booleano)

Definir esse parâmetro como true instrui o nó coordenador a usar o formato de serialização binária do PostgreSQL (quando aplicável) para transferir dados com trabalhadores. Alguns tipos de coluna não suportam serialização binária.

Habilitar esse parâmetro é principalmente útil quando os trabalhadores devem retornar grandes quantidades de dados. Exemplos são quando muitas linhas são solicitadas, as linhas têm muitas colunas ou usam tipos amplos, como hll da extensão postgresql-hll.

O valor predefinido é true. Quando definido como false, todos os resultados são codificados e transferidos em formato de texto.

citus.max_adaptive_executor_pool_size (inteiro)

Max_adaptive_executor_pool_size limita as conexões de trabalho da sessão atual. Este GUC é útil para:

  • Impedindo que um único back-end obtenha todos os recursos do trabalhador
  • Fornecendo gerenciamento de prioridades: designe sessões de baixa prioridade com baixo max_adaptive_executor_pool_size e sessões de alta prioridade com valores mais altos

O valor padrão é 16.

citus.executor_slow_start_interval (inteiro)

Tempo de espera em milissegundos entre a abertura de conexões para o mesmo nó de trabalho.

Quando as tarefas individuais de uma consulta com vários estilhaços levam pouco tempo, elas geralmente podem ser concluídas em uma única conexão (muitas vezes já armazenada em cache). Para evitar a abertura redundante de mais conexões, o executor aguarda entre as tentativas de conexão o número configurado de milissegundos. No final do intervalo, aumenta o número de conexões que pode abrir da próxima vez.

Para consultas longas (aquelas que levam >500 ms), o início lento pode adicionar latência, mas para consultas curtas é mais rápido. O valor padrão é 10 ms.

citus.max_cached_conns_per_worker (inteiro)

Cada back-end abre conexões com os trabalhadores para consultar os fragmentos. No final da transação, o número configurado de conexões é mantido aberto para acelerar os comandos subsequentes. Aumentar esse valor reduz a latência de consultas de vários estilhaços, mas também aumenta a sobrecarga sobre os trabalhadores.

O valor predefinido é 1. Um valor maior, como 2, pode ser útil para clusters que usam um pequeno número de sessões simultâneas, mas não é aconselhável ir muito além (por exemplo, 16 seria muito alto).

citus.force_max_query_parallelization (booleano)

Simula o executor em tempo real obsoleto e agora inexistente. Esse parâmetro é usado para abrir o maior número possível de conexões para maximizar a paralelização da consulta.

Quando esse GUC está habilitado, o Azure Cosmos DB para PostgreSQL força o executor adaptável a usar o maior número possível de conexões ao executar uma consulta distribuída paralela. Se não estiver habilitado, o executor pode optar por usar menos conexões para otimizar a taxa de transferência geral de execução da consulta. Internamente, configurar isso acaba true usando uma conexão por tarefa.

Um lugar onde esse parâmetro é útil é em uma transação cuja primeira consulta é leve e requer poucas conexões, enquanto uma consulta subsequente se beneficiaria de mais conexões. O Azure Cosmos DB para PostgreSQL decide quantas conexões usar em uma transação com base na primeira instrução, o que pode limitar outras consultas, a menos que usemos o GUC para fornecer uma dica.

BEGIN;
-- add this hint
SET citus.force_max_query_parallelization TO ON;

-- a lightweight query that doesn't require many connections
SELECT count(*) FROM table WHERE filter = x;

-- a query that benefits from more connections, and can obtain
-- them since we forced max parallelization above
SELECT ... very .. complex .. SQL;
COMMIT;

O valor predefinido é false.

Configuração do executor do controlador de tarefas

citus.task_tracker_delay (inteiro)

Este parâmetro define o tempo de suspensão do controlador de tarefas entre as rodadas de gerenciamento de tarefas e os padrões como 200 ms. O processo do controlador de tarefas é ativado regularmente, percorre todas as tarefas atribuídas a ele e agenda e executa essas tarefas. Em seguida, o rastreador de tarefas dorme por um período de tempo antes de passar por essas tarefas novamente. Esse valor de configuração determina a duração desse período de suspensão. Este parâmetro é eficaz nos trabalhadores e precisa ser alterado no arquivo postgresql.conf. Depois de editar o arquivo de configuração, os usuários podem enviar um sinal SIGHUP ou reiniciar o servidor para que a alteração entre em vigor.

Este parâmetro pode ser diminuído para reduzir o atraso causado pelo executor do controlador de tarefas, reduzindo o intervalo de tempo entre as rodadas de gerenciamento. Diminuir o atraso é útil nos casos em que as consultas de estilhaços são curtas e, portanto, atualizam seu status regularmente.

citus.max_assign_task_batch_size (inteiro)

O executor do controlador de tarefas no coordenador atribui tarefas em lotes de forma síncrona ao daemon nos trabalhadores. Este parâmetro define o número máximo de tarefas a atribuir em um único lote. A escolha de um tamanho de lote maior permite uma atribuição de tarefas mais rápida. No entanto, se o número de trabalhadores for grande, poderá demorar mais tempo até que todos os trabalhadores obtenham tarefas. Este parâmetro pode ser definido em tempo de execução e é eficaz no coordenador.

citus.max_running_tasks_per_node (inteiro)

O processo do controlador de tarefas agenda e executa as tarefas atribuídas a ele conforme apropriado. Esse valor de configuração define o número máximo de tarefas a serem executadas simultaneamente em um nó a qualquer momento e o padrão é 8.

O limite garante que você não tenha muitas tarefas acessando o disco ao mesmo tempo e ajuda a evitar a contenção de E/S do disco. Se suas consultas forem atendidas a partir de memória ou SSDs, você pode aumentar max_running_tasks_per_node sem muita preocupação.

citus.partition_buffer_size (inteiro)

Define o tamanho do buffer a ser usado para operações de partição e o padrão é de 8 MB. O Azure Cosmos DB para PostgreSQL permite que os dados da tabela sejam reparticionados em vários arquivos quando duas tabelas grandes estão sendo unidas. Depois que esse buffer de partição é preenchido, os dados reparticionados são liberados em arquivos no disco. Essa entrada de configuração pode ser definida em tempo de execução e é efetiva nos trabalhadores.

Explicar os resultados

citus.explain_all_tasks (booleano)

Por padrão, o Azure Cosmos DB para PostgreSQL mostra a saída de uma única tarefa arbitrária ao executar EXPLAIN em uma consulta distribuída. Na maioria dos casos, a saída explicativa é semelhante entre as tarefas. Ocasionalmente, algumas das tarefas são planeadas de forma diferente ou têm tempos de execução muito mais elevados. Nesses casos, pode ser útil habilitar esse parâmetro, após o qual a saída EXPLAIN inclui todas as tarefas. Explicar todas as tarefas pode fazer com que o EXPLAIN demore mais tempo.

citus.explain_analyze_sort_method (enum)

Determina o método de classificação das tarefas na saída de EXPLAIN ANALYZE. O valor padrão de citus.explain_analyze_sort_method é execution-time.

Os valores suportados são:

  • execution-time: ordenar por tempo de execução.
  • taskId: ordenar por ID da tarefa.

Parâmetros do PgBouncer gerenciado

Os seguintes parâmetros gerenciados do PgBouncer podem ser configurados em um único nó ou coordenador.

Nome do Parâmetro Description Predefinido
pgbouncer.default_pool_size Defina esse valor de parâmetro para o número de conexões por par usuário/banco de dados. 295
pgbouncer.ignore_startup_parameters Lista separada por vírgulas de parâmetros que o PgBouncer pode ignorar. Por exemplo, você pode deixar o parâmetro PgBouncer ignorar extra_float_digits . Alguns parâmetros são permitidos, todos os outros geram erro. Essa capacidade é necessária para tolerar JDBC superentusiasmado querendo definir incondicionalmente 'extra_float_digits=2' no pacote de inicialização. Use esta opção se a biblioteca usada relatar erros, como pq: unsupported startup parameter: extra_float_digits. extra_float_digits, ssl_renegotiation_limit
pgBouncer.max_cliente_conn Defina esse valor de parâmetro para o maior número de conexões de cliente para PgBouncer que você deseja suportar. 2000
pgBouncer.min_pool_size Adicione mais conexões de servidor ao pool se estiver abaixo desse número. 0 (Desativado)
pgBouncer.pool_mode Defina esse valor de parâmetro como TRANSACTION para pool de transações (que é a configuração recomendada para a maioria das cargas de trabalho). TRANSAÇÃO
pgbouncer.query_wait_timeout O tempo máximo (em segundos) das consultas pode ser gasto aguardando a execução. Se a consulta não for atribuída a um servidor durante esse tempo, o cliente será desconectado. 20 s
pgbouncer.server_idle_timeout Se uma conexão de servidor tiver ficado ociosa mais do que esses segundos, ela será fechada. Se 0, este tempo limite está desativado. 60 s

Parâmetros do PostgreSQL

  • DateStyle - Define o formato de exibição para valores de data e hora
  • IntervalStyle - Define o formato de exibição para valores de intervalo
  • Fuso horário - Define o fuso horário para exibir e interpretar carimbos de data/hora
  • application_name - Define o nome do aplicativo a ser relatado em estatísticas e logs
  • array_nulls - Permite a entrada de elementos NULL em matrizes
  • autovacuum - Inicia o subprocesso de autovacuum
  • autovacuum_analyze_scale_fator - Número de inserções, atualizações ou exclusões de tuplas antes de analisar como uma fração de reltuplas
  • autovacuum_analyze_threshold - Número mínimo de inserções, atualizações ou exclusões de tuplas antes de analisar
  • autovacuum_naptime - Tempo para dormir entre as corridas de autovácuo
  • autovacuum_vacuum_cost_delay - Atraso no custo do vácuo em milissegundos, para autovácuo
  • autovacuum_vacuum_cost_limit - Valor do custo de vácuo disponível antes de cochilar, para autovácuo
  • autovacuum_vacuum_scale_fator - Número de atualizações ou exclusões de tuplas antes do vácuo como uma fração de reltuplas
  • autovacuum_vacuum_threshold - Número mínimo de atualizações ou exclusões de tuplas antes do vácuo
  • autovacuum_work_mem - Define a memória máxima a ser usada por cada processo de trabalho de autovácuo
  • backend_flush_after - Número de páginas após as quais as gravações executadas anteriormente são liberadas no disco
  • backslash_quote - Define se "'" é permitido em literais de cadeia de caracteres
  • bgwriter_delay - Tempo de sono do escritor de fundo entre as rodadas
  • bgwriter_flush_after - Número de páginas após as quais as gravações executadas anteriormente são liberadas no disco
  • bgwriter_lru_maxpages - Gravador de fundo, número máximo de páginas LRU para limpar por rodada
  • bgwriter_lru_multiplier - Múltiplo do uso médio do buffer para liberar por rodada
  • bytea_output - Define o formato de saída para bytea
  • check_function_bodies - Verifica os corpos de função durante CREATE FUNCTION
  • checkpoint_completion_target - Tempo gasto na lavagem de buffers sujos durante o checkpoint, como fração do intervalo do checkpoint
  • checkpoint_timeout - Define o tempo máximo entre os pontos de verificação WAL automáticos
  • checkpoint_warning - Permite avisos se os segmentos de pontos de verificação forem preenchidos com mais frequência do que isso
  • client_encoding - Define a codificação do conjunto de caracteres do cliente
  • client_min_messages - Define os níveis de mensagem que são enviados para o cliente
  • commit_delay - Define o atraso em microssegundos entre a confirmação da transação e a liberação da WAL para o disco
  • commit_siblings - Define o mínimo de transações abertas simultâneas antes de executar commit_delay
  • constraint_exclusion - Permite que o planejador use restrições para otimizar consultas
  • cpu_index_tuple_cost - Define a estimativa do planejador do custo de processamento de cada entrada de índice durante uma verificação de índice
  • cpu_operator_cost - Define a estimativa do planejador do custo de processamento de cada operador ou chamada de função
  • cpu_tuple_cost - Define a estimativa do planejador do custo de processamento de cada tupla (linha)
  • cursor_tuple_fraction - Define a estimativa do planejador da fração das linhas de um cursor que são recuperadas
  • deadlock_timeout - Define a quantidade de tempo, em milissegundos, para aguardar em um bloqueio antes de verificar se há impasse
  • debug_pretty_print - Recuos analisam e planejam exibições de árvore
  • debug_print_parse - Registra a árvore de análise de cada consulta
  • debug_print_plan - Registra o plano de execução de cada consulta
  • debug_print_rewritten - Registra a árvore de análise reescrita de cada consulta
  • default_statistics_target - Define o destino de estatísticas padrão
  • default_tablespace - Define o espaço de tabela padrão para criar tabelas e índices em
  • default_text_search_config - Define a configuração de pesquisa de texto padrão
  • default_transaction_deferrable - Define o status de referência padrão de novas transações
  • default_transaction_isolation - Define o nível de isolamento de cada nova transação
  • default_transaction_read_only - Define o status somente leitura padrão de novas transações
  • default_with_oids - Cria novas tabelas com OIDs por padrão
  • effective_cache_size - Define a suposição do planejador sobre o tamanho do cache de disco
  • enable_bitmapscan - Permite o uso de planos de verificação de bitmap pelo planejador
  • enable_gathermerge - Permite que o planejador use planos de mesclagem de coleta
  • enable_hashagg – permite a utilização do planeador de planos de agregação hash
  • enable_hashjoin – permite a utilização do planeador de planos de associação hash
  • enable_indexonlyscan - Permite o uso de planos de verificação somente de índice pelo planejador
  • enable_indexscan - Permite o uso de planos de verificação de índice pelo planejador
  • enable_material - Possibilita o uso da materialização pelo planejador
  • enable_mergejoin - Permite que o planejador use planos de mesclagem de junção
  • enable_nestloop - Permite o uso de planos de junção de loop aninhados pelo planejador
  • enable_seqscan - Permite o uso de planos de verificação sequencial pelo planejador
  • enable_sort - Permite que o planejador use etapas de classificação explícitas
  • enable_tidscan - Permite o uso de planos de verificação TID pelo planejador
  • escape_string_warning - Alerta sobre fugas de barra invertida em literais de cordas comuns
  • exit_on_error - Encerra a sessão em qualquer erro
  • extra_float_digits - Define o número de dígitos exibidos para valores de vírgula flutuante
  • force_parallel_mode - Força o uso de recursos de consulta paralela
  • from_collapse_limit - Define o tamanho da lista FROM além do qual as subconsultas não são recolhidas
  • geqo - Permite a otimização de consultas genéticas
  • geqo_effort - GEQO: esforço é usado para definir o padrão para outros parâmetros GEQO
  • geqo_generations - GEQO: número de iterações do algoritmo
  • geqo_pool_size - GEQO: número de indivíduos na população
  • geqo_seed - GEQO: semente para seleção de caminhos aleatórios
  • geqo_selection_bias - GEQO: pressão seletiva dentro da população
  • geqo_threshold - Define o limite de itens FROM além dos quais o GEQO é usado
  • gin_fuzzy_search_limit - Define o resultado máximo permitido para pesquisa exata por GIN
  • gin_pending_list_limit - Define o tamanho máximo da lista pendente para o índice GIN
  • idle_in_transaction_session_timeout - Define a duração máxima permitida de qualquer transação ociosa
  • join_collapse_limit - Define o tamanho da lista FROM além do qual as construções JOIN não são niveladas
  • lc_monetary - Define a localidade para formatar valores monetários
  • lc_numeric - Define a localidade para formatar números
  • lo_compat_privileges - Habilita o modo de compatibilidade com versões anteriores para verificações de privilégios em objetos grandes
  • lock_timeout - Define a duração máxima permitida (em milissegundos) de qualquer espera por um bloqueio. 0 desliga esta opção
  • log_autovacuum_min_duration - Define o tempo mínimo de execução acima do qual as ações de autovacuum são registradas
  • log_connections - Registra cada conexão bem-sucedida
  • log_destination - Define o destino para a saída do log do servidor
  • log_disconnections - Registra o fim de uma sessão, incluindo a duração
  • log_duration - Registra a duração de cada instrução SQL concluída
  • log_error_verbosity - Define a verborragia das mensagens registradas
  • log_lock_waits - Registra longas esperas de bloqueio
  • log_min_duration_statement - Define o tempo mínimo de execução (em milissegundos) acima do qual as instruções são registradas. -1 desativa as durações da instrução de registro
  • log_min_error_statement - Faz com que todas as instruções que geram erro em ou acima desse nível sejam registradas
  • log_min_messages - Define os níveis de mensagem que são registrados
  • log_replication_commands - Registra cada comando de replicação
  • log_statement - Define o tipo de instruções registradas
  • log_statement_stats - Para cada consulta, grava estatísticas de desempenho cumulativo no log do servidor
  • log_temp_files - Registra o uso de arquivos temporários maiores que esse número de kilobytes
  • maintenance_work_mem - Define a memória máxima a ser usada para operações de manutenção
  • max_parallel_workers - Define o número máximo de trabalhadores paralelos que podem estar ativos ao mesmo tempo
  • max_parallel_workers_per_gather - Define o número máximo de processos paralelos por nó executor
  • max_pred_locks_per_page - Define o número máximo de tuplas bloqueadas por predicado por página
  • max_pred_locks_per_relation - Define o número máximo de páginas bloqueadas por predicado e tuplas por relação
  • max_standby_archive_delay - Define o atraso máximo antes de cancelar consultas quando um servidor hot standby está processando dados WAL arquivados
  • max_standby_streaming_delay - Define o atraso máximo antes de cancelar consultas quando um servidor de espera ativa está processando dados WAL transmitidos
  • max_sync_workers_per_subscription - Número máximo de trabalhadores de sincronização de tabelas por assinatura
  • max_wal_size - Define o tamanho da WAL que aciona um ponto de verificação
  • min_parallel_index_scan_size - Define a quantidade mínima de dados de índice para uma verificação paralela
  • min_wal_size - Define o tamanho mínimo para reduzir a WAL para
  • operator_precedence_warning - Emite um aviso para construções que mudaram de significado desde o PostgreSQL 9.4
  • parallel_setup_cost - Define a estimativa do planejador do custo de inicialização de processos de trabalho para consulta paralela
  • parallel_tuple_cost - Define a estimativa do planejador do custo de passar cada tupla (linha) do trabalhador para o backend principal
  • pg_stat_statements.save - Salva estatísticas de pg_stat_statements em desligamentos de servidores
  • pg_stat_statements.track - Seleciona quais instruções são rastreadas por pg_stat_statements
  • pg_stat_statements.track_utility - Seleciona se os comandos do utilitário são rastreados por pg_stat_statements
  • quote_all_identifiers - Ao gerar fragmentos SQL, cita todos os identificadores
  • random_page_cost - Define a estimativa do planejador do custo de uma página de disco não obtida sequencialmente
  • row_security - Permite a segurança de linha
  • search_path - Define a ordem de pesquisa de esquema para nomes que não são qualificados para esquema
  • seq_page_cost - Define a estimativa do planejador do custo de uma página de disco obtida sequencialmente
  • session_replication_role - Define o comportamento da sessão para gatilhos e regras de reescrita
  • standard_conforming_strings - Causas '...' cordas para tratar as barras invertidas literalmente
  • statement_timeout - Define a duração máxima permitida (em milissegundos) de qualquer instrução. 0 desliga esta opção
  • synchronize_seqscans - Permite verificações sequenciais sincronizadas
  • synchronous_commit - Define o nível de sincronização da transação atual
  • tcp_keepalives_count - Número máximo de retransmissões TCP keepalive
  • tcp_keepalives_idle - Tempo entre a emissão de keepalives TCP
  • tcp_keepalives_interval - Tempo entre as retransmissões TCP keepalive
  • temp_buffers - Define o número máximo de buffers temporários usados por cada sessão de banco de dados
  • temp_tablespaces - Define o(s) espaço(s) de tabela a serem usados para tabelas temporárias e arquivos de classificação
  • track_activities - Coleta informações sobre a execução de comandos
  • track_counts - Recolhe estatísticas sobre a atividade da base de dados
  • track_functions - Coleta estatísticas de nível de função sobre a atividade do banco de dados
  • track_io_timing - Coleta estatísticas de tempo para a atividade de E/S do banco de dados
  • transform_null_equals - Trata "expr=NULL" como "expr IS NULL"
  • vacuum_cost_delay - Atraso no custo do vácuo em milissegundos
  • vacuum_cost_limit - Valor do custo de vácuo disponível antes de cochilar
  • vacuum_cost_page_dirty - Custo de vácuo para uma página suja por vácuo
  • vacuum_cost_page_hit - Custo de vácuo para uma página encontrada no cache do buffer
  • vacuum_cost_page_miss - Custo de vácuo para uma página não encontrada no cache do buffer
  • vacuum_defer_cleanup_age - Número de transações pelas quais a limpeza VACUUM e HOT deve ser adiada, se houver
  • vacuum_freeze_min_age - Idade mínima em que o VÁCUO deve congelar uma linha de tabela
  • vacuum_freeze_table_age - Idade em que o VACUUM deve digitalizar toda a mesa para congelar tuplas
  • vacuum_multixact_freeze_min_age - Idade mínima em que o VACUUM deve congelar um MultiXactId numa linha de tabela
  • vacuum_multixact_freeze_table_age - Multixact idade em que VACUUM deve digitalizar toda a mesa para congelar tuplas
  • wal_receiver_status_interval - Define o intervalo máximo entre os relatórios de status do recetor WAL para o primário
  • wal_writer_delay - Tempo entre as descargas WAL realizadas no gravador WAL
  • wal_writer_flush_after - Quantidade de WAL escrita pelo gravador WAL que dispara um flush
  • work_mem – define a quantidade de memória a utilizar por operações internas de ordenação e tabelas hash antes de escrever em ficheiros de disco temporários
  • xmlbinary - Define como os valores binários devem ser codificados em XML
  • xmloption - Define se os dados XML em operações implícitas de análise e serialização devem ser considerados como documentos ou fragmentos de conteúdo

Próximos passos

  • Outra forma de configuração, além dos parâmetros do servidor, são as opções de configuração de recursos em um cluster.
  • A base de dados PostgreSQL subjacente também tem parâmetros de configuração.