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 / 338107
Accepted
Codemonkey
Codemonkey
Asked: 2024-03-27 20:26:52 +0800 CST2024-03-27 20:26:52 +0800 CST 2024-03-27 20:26:52 +0800 CST

O desempenho da consulta cai de um penhasco com JOINs adicionais - posso corrigir isso ajustando um parâmetro?

  • 772

Executando 10.8.8-MariaDB-log

Tenho uma consulta muito complexa para um site de comparação.

Essencialmente

SELECT <columns> FROM <tables>
                 JOIN <derived table 1 for first comparison>
                 JOIN <derived table 2 for first comparison>
                 JOIN <derived table 1 for second comparison>
                 JOIN <derived table 2 for second comparison>

Funciona em <0,1s

Se eu mudar para

SELECT <columns> FROM <tables>
                 JOIN <derived table 1 for first comparison>
                 JOIN <derived table 2 for first comparison>
                 JOIN <derived table 1 for second comparison>
                 JOIN <derived table 2 for second comparison>
                 JOIN <derived table 1 for third comparison>
                 JOIN <derived table 2 for third comparison>

Demora mais de 10 segundos

Os índices são sólidos e o sql para criar as tabelas derivadas é o mesmo para cada comparação, exceto um valor de parâmetro de ID. Tudo o que muda é o número deles.

Eu suspeito que há algum buffer/cache que precisa ser aumentado um pouco? 🤷‍♂️

Sim , eu poderia reescrever a página/sql inteiramente para fazer isso por meio de um mecanismo muito diferente, mas se eu puder consertar isso com uma simples alteração de configuração, dados os recursos disponíveis na máquina, prefiro fazer isso. O tempo é curto.

Compreendo que isso possa ser um problema x/y, mas espero que haja um fruto fácil de alcançar que os mais experientes aqui sejam capazes de identificar imediatamente.

FWIW - filmando no escuro - tentei quadruplicar o tamanho desses três e não fez diferença:

join_buffer_size      = 32M (to 128M)
sort_buffer_size      = 4M  (to 16M)
read_rnd_buffer_size  = 4M  (to 16M)

Obrigado

mariadb
  • 2 2 respostas
  • 38 Views

2 respostas

  • Voted
  1. Best Answer
    Codemonkey
    2024-03-28T03:46:35+08:002024-03-28T03:46:35+08:00

    TIL sobre STRAIGHT_JOIN.

    STRAIGHT_JOINé como JOIN, exceto que diz ao otimizador de consulta para executar a consulta da maneira que você a criou.

    Por que isso é importante? Fatoriais, basicamente.

    O otimizador conhece muitos truques inteligentes para adivinhar o melhor plano de execução, mas ESSENCIALMENTE, a complexidade de trabalhar esse plano de execução segue um padrão fatorial.

    • 1 mesa? 1 opção
    • 2 mesas? 2 opções
    • 3 mesas? 6 opções
    • 4 mesas? 24 opções
    • 5 mesas? 120 opções

    No exemplo da minha pergunta original, eu tinha 14 tabelas. 87 bilhões de opções

    E então 16 mesas. 2 TRILHÕES de opções

    Como eu disse, o otimizador não é tão burro, pode podar muito e usar muitos atalhos, mas acho que os números ilustram o problema com MUITAS tabelas em uma consulta. O problema não é quanto tempo a consulta leva para ser executada, mas sim quanto tempo o otimizador leva para descobrir COMO executá-la.

    Caso em questão. Tenho uma consulta que estou testando/mexendo na minha frente agora, com 18 tabelas.

    Eu não fiz literalmente nada , a não ser substituir todos os meus JOINs por STRAIGHT_JOINs.

    O resultado? Meu tempo de consulta caiu de 1,65s para 0,002s .

    • 1
  2. Rick James
    2024-03-28T04:53:58+08:002024-03-28T04:53:58+08:00

    Essa construção é péssima para o desempenho porque nenhuma das "tabelas derivadas" possui índices:

    FROM ( SELECT ... ) a
    JOIN ( SELECT ... ) b  ON ...
    ...
    

    Então, sim, adicionar mais JOINé péssimo para o desempenho.

    Não, você não pode sair do problema. (O ajuste pode ajudar, mas não é uma solução real.)

    Vamos ver um mais completo SELECT, junto com alguns SHOW CREATE TABLEs; poderemos fornecer algumas sugestões construtivas.

    • 0

relate perguntas

  • Erro de cabeçalho do MariaDB

  • Erro 1046 Mariadb: nenhum banco de dados selecionado

  • Você ainda usa o MyISAM ou prefere o mecanismo de armazenamento Aria?

  • Como posso melhorar minha instrução SQL com resultados semanais com semana começando na quinta-feira ou em qualquer outro dia da semana?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

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