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 / 20555
Accepted
Tommy O'Dell
Tommy O'Dell
Asked: 2012-07-09 16:36:06 +0800 CST2012-07-09 16:36:06 +0800 CST 2012-07-09 16:36:06 +0800 CST

Aprendendo a otimizar consultas SQL e entender os planos de execução - Recursos?

  • 772

Vejo-me escrevendo cada vez mais consultas SQL no trabalho (principalmente Oracle 11g, mas algumas SQL Server 2005-2008) e comecei a criar algumas visualizações bastante complexas para o restante da equipe de analistas.

Quase todos eles funcionam muito bem, mas alguns deles não tão bem. Então...

  • Como aprendo a sintonizar minhas consultas?
  • Preciso aprender a ler/agir sobre Planos de Execução?

E...

  • Quais livros/sites você pode recomendar para aprender sobre ajuste de consulta SQL 1) em geral 2) especificamente para Oracle 11g?

Temos alguns bons DBAs aqui, mas eles estão sobrecarregados demais para nos ajudar a ajustar cada consulta que escrevemos.

A maioria dos livros que encontrei na Amazon para Oracle parecem ser voltados para a otimização geral do banco de dados e/ou foram escritos de 8 a 10 anos atrás.

Obrigado gentilmente por seu conselho :)

performance oracle-11g-r2
  • 2 2 respostas
  • 12081 Views

2 respostas

  • Voted
  1. Best Answer
    Chris Saxon
    2012-07-10T08:32:06+08:002012-07-10T08:32:06+08:00

    Eu diria que aprender a entender os planos de explicação é uma habilidade vital para ajudá-lo a otimizar as instruções SQL. Achei o livro de Christian Antognini, Troubleshooting Oracle Performance , muito útil para detalhar como eles funcionam, além de explicar como abordar a otimização do banco de dados. Com alguns anos de idade, você ainda aprenderá muito que ainda é relevante com ele.

    Se você for mais avançado, poderá consultar os livros de Jonathan Lewis, mas eles são mais aprofundados, portanto provavelmente não são um bom ponto de partida. O Oracle Fundamentals baseado em custo é bastante antigo agora, mas muito ainda é relevante. Ainda não li o Oracle Core: Essential Internals for Troubleshooting , mas recebi boas críticas da comunidade Oracle.

    Como você está no 11g, se tiver consultas que demoram mais do que alguns segundos, eu definitivamente recomendo olhar para o monitor SQL em tempo real (supondo que você esteja devidamente licenciado). Como o nome sugere, ele mostra o progresso de uma instrução SQL em tempo real, detalhando quanto tempo cada operação levou com detalhes das linhas buscadas até o momento. Ele também mantém os detalhes das consultas executadas recentemente por um curto período, para que você possa ver como suas alterações afetam uma instrução.

    Documentação do Oracle SQL Monitoring: http://docs.oracle.com/cd/E11882_01/server.112/e16638/instance_tune.htm#PFGRF94543

    Aprender a ajustar as consultas é algo que requer tempo e prática. Algumas coisas que aprendi:

    • Escreva consultas para buscar o menor número possível de linhas o mais rápido possível (por exemplo, você não deseja fazer uma varredura completa em uma tabela de 10 milhões de linhas se precisar apenas de 100 linhas dela)
    • Verifique se o número de linhas esperado em cada etapa de um plano de explicação (esperado) corresponde aos retornados no plano de execução real. Quando essas ordens de magnitude são diferentes, é provável que o otimizador não esteja escolhendo o "melhor" plano.
    • Entenda os princípios de uma boa indexação: como eles funcionam e quando devem/não devem ser usados ​​ao executar uma consulta ( Richard Foote tem um blog muito aprofundado discutindo índices no Oracle)

    Principalmente, você aprenderá escrevendo consultas, observando os planos de explicação (esperados) e comparando-os com os planos de execução reais (por meio do rastreamento da consulta ou usando o monitor SQL). Em seguida, reescreva a consulta, adicione/remova índices etc. e veja como isso afeta os planos e os tempos de execução

    • 7
  2. BillThor
    2012-07-09T20:16:11+08:002012-07-09T20:16:11+08:00

    Como você está procurando informações específicas da Oracle, recomendo o blog Ask Tom na Oracle. Em geral, acho que você descobrirá que o conselho é não ajustar a consulta. Você receberá bons conselhos sobre como escrever uma consulta que o otimizador pode otimizar. A documentação do Oracle também está online , e geralmente procuro informações atualizadas sobre o Oracle. Eu não trabalhei com SQLServer, então não tenho nenhuma recomendação para isso.

    Não tenho visto muitas novidades no campo de otimização de consultas nos últimos anos. A grande mudança é a depreciação do otimizador baseado em regras, com o qual mal me lembro de ter trabalhado. No entanto, entendo que o SQLServer ainda usa um otimizador baseado em regras, portanto, entender suas regras pode ajudar.

    Uma ferramenta na qual você pode editar uma consulta, executá-la e gerar um plano de explicação ajuda a entender quais alterações levam a uma consulta com bom desempenho. Tive bons resultados com o AquaData Studio e gosto muito de sua visualização em árvore. O SQL Developer também deve fazer isso.

    Como em qualquer otimização, você precisa ter dados quantitativos sobre seu desempenho. Então você pode determinar se realmente o otimizou.

    Como otimizar uma consulta depende em parte de como o analisador constrói e otimiza a consulta. Em grande medida, depende da distribuição dos dados que você está consultando. Em um banco de dados Oracle, se o conjunto de resultados representar quatro por cento ou mais de uma tabela e for distribuído aleatoriamente, uma varredura de tabela geralmente é mais rápida que um índice.

    Trabalhei para otimizar consultas para uma equipe de desenvolvedores. Apenas duas ou três consultas por ano exigiam uma otimização séria. A maioria das consultas é simples o suficiente para não precisar de otimização. O restante geralmente pode ser tratado adicionando caminhos de junção ausentes.

    Para Oracle, há três configurações ajustáveis ​​que podem afetar significativamente o desempenho. O custo para pesquisas de índice e dados interagem para alterar as condições sob as quais um índice in será ou não usado. Esses dois podem ser ajustados por sessão. Os padrões geralmente não são ideais. O outro valor controla quantas alternativas o otimizador tentará. Aumentar esse valor geralmente ajuda.

    A otimização é significativamente afetada pela distribuição e volume de dados. Ao otimizá-lo, é melhor usar uma cópia do banco de dados de produção ou, pelo menos, um banco de dados com a mesma distribuição e volumes de dados. Eu quebrei severamente o ambiente de teste, otimizando uma consulta ao banco de dados de ordens de produção. Os bancos de dados de teste e desenvolvimento tinham uma distribuição de dados significativamente diferente, o que fazia com que a consulta falhasse mesmo com menos dados.

    • 1

relate perguntas

  • Como você ajusta o MySQL para uma carga de trabalho pesada do InnoDB?

  • Existe uma maneira de permitir que uma conexão proxy use autenticação passada em um link de banco de dados público?

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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