AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 332715
Accepted
Francis Ducharme
Francis Ducharme
Asked: 2023-11-02 05:11:29 +0800 CST2023-11-02 05:11:29 +0800 CST 2023-11-02 05:11:29 +0800 CST

Onde obter os logs de erros/informações sobre o que acontece ao confirmar várias instruções?

  • 772

Tive um problema com a falta de um índice em uma tabela e a única maneira que tive de reunir pistas foi desta forma:

BEGIN TRANSACTION;
-- OVER 100 DELETES
COMMIT;

No DBeaver, selecionei apenas a primeira linha e as exclusões subsequentes, executei isso. Em seguida, selecionei a linha de commit, executei-a e esperei até sentir que estava demorando muito.

Então o DBeaver me deu esta mensagem quando cancelei a transação:

SQL Error [57014]: ERROR: canceling statement due to user request
  Where: SQL statement "SELECT 1 FROM ONLY "schema"."table" x WHERE $1 OPERATOR(pg_catalog.=) "id_model" AND $2 OPERATOR(pg_catalog.=) "id_property1" AND $3 OPERATOR(pg_catalog.=) "id_property2" FOR KEY SHARE OF x"

id_modelé a cláusula WHERE para todos os DELETEs em questão. A consulta mencionada na mensagem definitivamente não é um código escrito por mim, em qualquer lugar de qualquer função/procedimento/gatilho que eu possa imaginar.

Tirei disso que um índice ausente nas tablecolunas id_property1era id_property2o problema, e aparentemente era.

Há algum log explicando o que está acontecendo "nos bastidores" quando o servidor está processando várias instruções enfileiradas na transação onde eu poderia ter encontrado essa instrução com mais facilidade?

Existem várias restrições de exclusão de chave estrangeira configuradas no modelo, então acho que quando os índices estão faltando, o servidor demora um pouco para encontrar a maneira correta de contornar.

postgresql
  • 2 2 respostas
  • 49 Views

2 respostas

  • Voted
  1. Erwin Brandstetter
    2023-11-02T08:18:18+08:002023-11-02T08:18:18+08:00

    Não posso comentar sobre o DBeaver. É um cliente genérico, não otimizado para Postgres. Tenho visto reclamações ocasionais sobre atritos aqui no dba.SE e SO.

    É responsabilidade do cliente mostrar mensagens ( ERROR, WARNING, NOTICE, ...) para cada comando. Não tenho certeza de como o DBeaver lida com isso. Talvez você precise executar cada um DELETEseparadamente (ainda permanecendo na mesma transação) para ver todas as mensagens.

    Você pode ajustar as configurações do Postgres client_min_messagese log_min_messagesajustar os níveis de mensagens que são enviadas para o cliente e para o log do banco de dados, respectivamente.

    Mas a SELECTdeclaração que você exibe não é uma “mensagem”. É um comando SQL simples. Você ou seu cliente devem tê-lo emitido. A sintaxe incomumente explícita ( OPERATOR(pg_catalog.=)em vez de apenas =) indica código gerado por máquina. Talvez fosse parte de uma mensagem maior mostrando o que a consulta cancelada estava esperando. Se um índice ausente faz com que uma instrução específica domine o tempo de execução, as chances de capturá-la em flagrante são boas ao interromper a execução. Ainda é coincidência.

    Além disso, embora um índice qualificado possa acelerar (muito) os comandos SQL, um índice "ausente" não é uma condição de erro (ou condição para qualquer nível de mensagem). Você não receberá uma mensagem do Postgres. A criação de índices fica a critério do usuário. Criar apenas os corretos é uma das principais tarefas do arquiteto/administrador de banco de dados. Existem inúmeras sutilezas nisso. As colunas alvo das restrições FK são indexadas por definição (é necessária uma restrição PK ou UNIQUE). As colunas de origem das restrições FK são as principais candidatas para um índice de árvore B simples. Ou, como diz o manual :

    Uma chave estrangeira deve fazer referência a colunas que sejam uma chave primária ou formem uma restrição exclusiva. Isso significa que as colunas referenciadas sempre possuem um índice (aquele subjacente à chave primária ou restrição exclusiva); portanto, verificar se uma linha de referência corresponde será eficiente. Como uma DELETElinha da tabela referenciada ou uma UPDATEcoluna referenciada exigirá uma varredura da tabela de referência em busca de linhas que correspondam ao valor antigo, geralmente é uma boa ideia indexar também as colunas de referência. Como isso nem sempre é necessário e há muitas opções disponíveis sobre como indexar, a declaração de uma restrição de chave estrangeira não cria automaticamente um índice nas colunas de referência.

    Monitore consultas lentas para obter indicações (não provas) das otimizações ausentes mais urgentes. Existem várias maneiras, principalmente: definir log_min_duration_statementou possivelmente log_min_duration_sampleamigos e, em seguida, estudar os logs do banco de dados gerados.

    E/ou use EXPLAIN (e todos os seus recursos) para diagnosticar planos de execução suspeitos.

    • 1
  2. Best Answer
    Laurenz Albe
    2023-11-03T00:13:45+08:002023-11-03T00:13:45+08:00

    A estranha instrução que você vê foi executada a partir de um gatilho que implementa restrições de chave estrangeira no PostgreSQL.

    Existem duas maneiras de obter dados sobre essas declarações:

    1. Se você configurar shared_preload_libraries = 'pg_stat_statements'e pg_stat_statements.track = allreiniciar o PostgreSQL, pg_stat_statements também coletará estatísticas sobre essas instruções "ocultas". Você pode visualizar esses dados com a pg_stat_statementsvisualização fornecida pela extensão de mesmo nome.

    2. Se você definir shared_preload_libraries = 'auto_explain'e auto_explain.log_nested_statements = onreiniciar auto_explain.log_min_duration = '500ms'o PostgreSQL, obterá o plano de execução de todas as instruções que são executadas por mais de meio segundo registradas, incluindo essas instruções "ocultas".

    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve