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 / 310862
Accepted
Racer SQL
Racer SQL
Asked: 2022-04-13 11:47:46 +0800 CST2022-04-13 11:47:46 +0800 CST 2022-04-13 11:47:46 +0800 CST

Que outras opções temos para ter?

  • 772

Apaguei minha pergunta antiga para ser mais preciso sobre o que preciso.

temos uma grande consulta contendo muitas consultas menores. Esta consulta funciona muito bem, até chegar à cláusula "have max":

having 
  max
  (
    DateField 
    ) < getdate() - @2_years_ago

existe alguma cláusula que pode ser mais rápida do que ter max? porque isso está causando uma varredura de índice e looping e looping sem parar pelos milhões de linhas que existem na tabela.

tentei fazer por row_number mas não tive sorte.

E só noto que essa mesma consulta roda muito bem em outros bancos de dados com a mesma estrutura.

apenas este (que curiosamente tem menos linhas) não funciona.

Dbs no mesmo servidor.

sql-server-2014
  • 1 1 respostas
  • 48 Views

1 respostas

  • Voted
  1. Best Answer
    Charlieface
    2022-04-13T12:48:28+08:002022-04-13T12:48:28+08:00

    Parece que seu principal problema é que a estimativa de cardinalidade ruim está fazendo com que o compilador reordene as junções. Isso parece estar acontecendo mais quando você usa OPTION (RECOMPILE), porque o servidor está fazendo estimativas diferentes.

    Você deve ser capaz de simplificar sua consulta atual o suficiente para que o compilador ache mais fácil

    Sem ver seu esquema, é difícil dizer exatamente, mas parece que você pode inverter a EXISTSlógica para NOT EXISTS.

    • Seu original diz "garantir que a data máxima no grupo seja menor que a minha data"
    • Você realmente quer que não haja linhas no grupo que sejam menores que a data, então você pode dizer "garantir que não haja linhas com uma data maior que a minha data".
    • Agora você não precisa de um HAVINGpara encontrar a data máxima.

    Sua consulta existente tem vários problemas:

    • a b csão aliases bobos, considere usar outros mais significativos.
    • Use []para citar nomes de coluna, não ''. Não cite a menos que você precise.
    • Por que está NOLOCKespalhado em todos os lugares como confete, o que você espera alcançar com isso? Tem implicações muito sérias para a integridade dos dados. Considere usar TABLOCKdicas em vez disso, ou SNAPSHOTisolamento.
    • As tabelas de junção à esquerda estão sendo filtradas para que você tenha uma junção interna implícita, você deve usar apenas associações internas.
    • Uma EXISTSsubconsulta não precisa selecionar nada, na verdade ela é ignorada. Você pode simplesmente fazer EXISTS (SELECT 1.
    • Por que três subconsultas, parece que você deve conseguir fazer isso em uma.
    • where b.[MerchantLogId] = a.[MerchantLogId] group by b.[MerchantLogId]não faz sentido: você sempre terá exatamente um grupo, então não há necessidade de group by.
    • Parece que você não precisa NTFM_MerchantLognas subconsultas, porque isso é unido pela chave primária.
    • Não use aritmética em datas, não funciona bem. Em vez disso, useDATEADD

    Também parece que você pode combinar as três subconsultas em uma, juntando todas as tabelas e usando OR(para isso, você ainda precisará de algumas associações à esquerda).

    Espero que, depois de fazer todas essas melhorias, você veja um desempenho melhor

    SELECT
      'NTFM_MerchantLog' AS [Process Master],
      COUNT(DISTINCT ml.MerchantLogId) AS [Registers Count]
    FROM
      dbo.NTFM_MerchantLog ml
      JOIN dbo.v_ntfm_merchantlogstatus mls on mls.MerchantLogStatusId = ml.StatusId
    WHERE
      ml.CreateDate < @Today - @lv_2484deletionCycle
      AND mls.Status IN ('Closed', 'Expired', 'Reconciled') 
    
      AND NOT EXISTS (SELECT 1
        FROM dbo.ntfm_merchantlogtransactions mlt
        JOIN dbo.accounttransaction at1 ON at1.accountTransactionId = mlt.accountTransactionId
    
        LEFT JOIN (
            dbo.ntfm_merchantlogtransactions mlt2
            JOIN dbo.ntfm_merchantlog ml2 ON ml2.MerchantLogId = mlt2.MerchantLogId
    
            LEFT JOIN (
                dbo.ntfm_merchantlogtransactions mlt3
                JOIN dbo.accounttransaction at2 on at2.accountTransactionId = mlt3.accountTransactionId
            ) ON mlt3.MerchantLogId = ml2.MerchantLogId
        ) ON mlt2.accountTransactionId = at1.accountTransactionId
    
         WHERE
           mlt.MerchantLogId = ml.MerchantLogId
         AND (
               at1.postingdt  >= DATEADD(day, -@lv_2484deletionCycle, @Today)
            OR ml2.createdate >= DATEADD(day, -@lv_2484deletionCycle, @Today)
            OR at2.postingdt  >= DATEADD(day, -@lv_2484deletionCycle, @Today)
         )
      );
    
    • 3

relate perguntas

  • Version lie shim para SQL Server 2014 [fechado]

  • Tarefa "Implantar banco de dados no SQL Azure" ausente

  • Colocando um ASSERT em uma consulta do SQL Server

  • Como "hackear" um instantâneo do banco de dados depois que a atualização do SQL Server o estragou

  • Instrução ALTER DATABASE não permitida na transação de várias instruções

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