Pergunta

Aqui está meu comando SQL:

SELECT  
    ts.CHECK_NUMBER,
    ts.CUSTOMER_NAME,
    ts.COMPANY_NAME,
   ( SELECT COUNT(*) 
     FROM   TRANSACTION_ORDER too 
     WHERE  too.CHECK_NUMBER = ts.CHECK_NUMBER
    ) as NB_OF_ORDERS
FROM 
     TRANSACTION_SUMMARY ts
ORDER BY 
     ts.BUSINESS_DATE

Está demorando tanto para renderizar os dados, estamos falando de no mínimo 3.000 transações, para cada uma temos que contar os pedidos.

Existe alguma solução melhor?

Foi útil?

Solução

Está demorando muito porque quando você tem essa subconsulta em seu select , ela é executada para cada linha retornada pela consulta externa, portanto, se sua consulta externa retornar 50.000 linhas, essa consulta de seleção interna será executada 50.000 vezes, o que é obviamente um assassino de desempenho,

Você deveria tentar algo assim....

SELECT  
     ts.CHECK_NUMBER
    ,ts.CUSTOMER_NAME
    ,ts.COMPANY_NAME
    ,ISNULL(O.Total, 0) AS NB_OF_ORDERS
FROM  TRANSACTION_SUMMARY ts
LEFT JOIN    --<-- use inner join is you only want records with some orders
      ( SELECT CHECK_NUMBER, COUNT(*) AS Total 
        FROM   TRANSACTION_ORDER 
        GROUP BY CHECK_NUMBER
      ) as O
ON ts.CHECK_NUMBER = O.CHECK_NUMBER
ORDER BY  ts.BUSINESS_DATE
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top