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 / 75048
Accepted
Pratyush Dhanuka
Pratyush Dhanuka
Asked: 2014-08-28 00:41:52 +0800 CST2014-08-28 00:41:52 +0800 CST 2014-08-28 00:41:52 +0800 CST

Desempenho de aplicação externa vs junção esquerda

  • 772

Estou usando o SQL SERVER 2008 R2

Acabei de encontrar o APPLY no SQL e adorei como ele resolve problemas de consulta para tantos casos,

Muitas das tabelas que eu estava usando 2 left join para obter o resultado, consegui entrar em 1 outer apply.

Eu tenho uma pequena quantidade de dados em minhas tabelas de banco de dados locais e, após a implantação, o código deve ser executado em dados pelo menos 20 vezes grandes.

Estou preocupado que a aplicação externa possa demorar mais do que as 2 condições de junção esquerda para grande quantidade de dados,

Alguém pode dizer como exatamente o apply funciona e como isso afetará o desempenho em dados muito grandes, se possível algumas relações proporcionais com o tamanho de cada tabela como proporcional a n1^1 ou n1^2 ... onde n1 é o número de linhas na tabela 1.

Aqui está a consulta com 2 joins à esquerda

select EC.*,DPD.* from Table1 eC left join
  (
   select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
   group by member_id,parent_gid,child_gid,LOB,group_gid

  ) DPD2 on DPD2.parent_gid = Ec.parent_gid
        AND DPD2.child_gid = EC.child_gid
        AND DPD2.member_id = EC.member_id
        AND DPD2.LOB = EC.default_lob
        AND DPD2.group_gid = EC.group_gid
  left join
  Table2 dpd on dpd.parent_gid = dpd2.parent_gid 
            and dpd.child_gid = dpd2.child_gid
            and dpd.member_id = dpd2.member_id 
            and dpd.group_gid = dpd2.group_gid 
            and dpd.LOB = dpd2.LOB
            and dpd.table2_sid = dpd2.mdsid

Aqui está a consulta com aplicação externa

select * from Table1 ec   
OUTER APPLY (
      select top 1 grace_begin_date,retroactive_begin_date,Isretroactive
                    from Table2 DPD 
                    where DPD.parent_gid = Ec.parent_gid
                    AND DPD.child_gid = EC.child_gid
                    AND DPD.member_id = EC.member_id
                    AND DPD.LOB = EC.default_lob
                    AND DPD.group_gid = EC.group_gid
                    order by DPD.table2_sid desc
     ) DPD 
sql-server join
  • 2 2 respostas
  • 99998 Views

2 respostas

  • Voted
  1. Best Answer
    Paul White
    2014-12-22T04:21:14+08:002014-12-22T04:21:14+08:00

    Alguém pode dizer como exatamente o apply funciona e como isso afetará o desempenho em dados muito grandes

    APPLYé uma junção correlacionada (chamada de LATERAL JOINem alguns produtos e versões mais recentes do SQL Standard). Como qualquer construção lógica, não tem impacto direto no desempenho. Em princípio, devemos ser capazes de escrever uma consulta usando qualquer sintaxe logicamente equivalente, e o otimizador transformaria nossa entrada exatamente no mesmo plano de execução física.

    Obviamente, isso exigiria que o otimizador conhecesse todas as transformações possíveis e tivesse tempo para considerar cada uma delas. Esse processo pode demorar mais do que a idade atual do universo, então a maioria dos produtos comerciais não adota essa abordagem. Portanto, a sintaxe de consulta pode, e geralmente tem, um impacto no desempenho final, embora seja difícil fazer declarações gerais sobre o que é melhor e por quê.

    A forma específica de OUTER APPLY ( SELECT TOP ... )provavelmente resultará em uma junção de loops aninhados correlacionados nas versões atuais do SQL Server, porque o otimizador não contém lógica para transformar esse padrão em um JOIN. A junção de loops aninhados correlacionados pode não funcionar bem se a entrada externa for grande e a entrada interna não for indexada ou as páginas necessárias ainda não estiverem na memória. Além disso, elementos específicos do modelo de custo do otimizador significam que uma junção de loops aninhados correlacionados é menos provável que uma semanticamente idêntica JOINpara produzir um plano de execução paralela.

    Consegui fazer a mesma consulta com uma única junção esquerda e row_number ()

    Isso pode ou não ser melhor no caso geral. Você precisará testar o desempenho de ambas as alternativas com dados representativos. O LEFT JOINe ROW_NUMBERcertamente tem potencial para ser mais eficiente, mas depende do formato preciso do plano de consulta escolhido. Os principais fatores que afetam a eficiência dessa abordagem são a disponibilidade de um índice para cobrir as colunas necessárias e fornecer a ordem necessária pelas cláusulas PARTITION BYe . ORDER BYUm segundo fator é o tamanho da tabela. Um eficiente e bem indexado APPLYpode superar um ROW_NUMBERcom indexação ideal se a consulta tocar uma parte relativamente pequena da tabela em questão. O teste é necessário.

    • 52
  2. user55424
    2014-12-22T04:07:26+08:002014-12-22T04:07:26+08:00

    A primeira consulta pode ser executada em paralelo por apenas uma solicitação ao servidor sql. Ele buscou todo o registro e fornece saída com base nos critérios de filtro.

    Mas, no caso do segundo, ele executa linha por linha e, para cada linha, a Tabela2 será verificada e anexada ao resultado.

    se sua consulta externa tiver menos registro, a segunda será melhor (OUTER APPLY). Mas se a primeira consulta puder obter mais dados, você deve usar a primeira.

    • 3

relate perguntas

  • Qual é a diferença entre um INNER JOIN e um OUTER JOIN?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como é a saída de uma instrução JOIN?

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

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