首页 > 解决方案 > sql查询性能低

问题描述

我想优化我的 sql 查询。当我在Investors_diversificacao表中放入大量数据时,它会变得非常慢并且无法加载。但是由于investors_diversificacao表中的数据很少,它可以加载数据。

我想帮助优化查询响应时间。

sql查询:

SELECT investors_positivador.cod_cliente, investors_saldo_financeiro.nome_cliente, investors_base_assessores.squad, investors_base_assessores.nome_investor, investors_saldo_financeiro.saldo_d0, 
                  SUM(CASE WHEN investors_posicao_geral.vencimento <= @vencimento THEN investors_posicao_geral.financeiro ELSE 0 END) AS vencimentos_ate_data, 
                  ROUND(SUM(CASE WHEN investors_diversificacao.produto = 'Fundos' THEN investors_diversificacao.net / 6 ELSE 0 END), 2) AS fundos_ate_data, investors_guia_fundos.liquidez_total, investors_positivador.contatar_liquidity_map, 
                  investors_positivador.id, investors_posicao_geral.vencimento, investors_base_assessores.nome_assessor
FROM     investors_positivador 
    INNER JOIN investors_saldo_financeiro ON cod_cliente = investors_saldo_financeiro.cod_cliente 
    INNER JOIN investors_base_assessores ON cod_assessor = investors_base_assessores.cod_assessor 
    INNER JOIN investors_posicao_geral ON investors_positivador.cod_cliente = investors_posicao_geral.cod_cliente 
    LEFT OUTER JOIN investors_diversificacao ON investors_positivador.cod_cliente = investors_diversificacao.cod_cliente 
    LEFT OUTER JOIN investors_guia_fundos ON investors_diversificacao.cnpj = investors_guia_fundos.cnpj
WHERE (investors_base_assessores.nome_investor = @investor_nome) AND (investors_saldo_financeiro.saldo_d0 > 0) 
   OR (investors_base_assessores.nome_investor = @investor_nome) AND (investors_posicao_geral.financeiro > 0) 
   OR (investors_base_assessores.nome_investor = @investor_nome) AND (investors_diversificacao.net > 0)
GROUP BY investors_positivador.cod_cliente

标签: mysqlsqlquery-optimization

解决方案


其中一些索引可能会有所帮助:

investors_positivador:       INDEX(cod_cliente,  contatar_liquidity_map, id)
investors_saldo_financeiro:  INDEX(cod_cliente, saldo_d0,  nome_cliente)
investors_base_assessores:   INDEX(nome_investor, cod_assessor,  squad, nome_assessor)
investors_posicao_geral:     INDEX(cod_cliente, financeiro,  vencimento)
investors_diversificacao:    INDEX(cod_cliente, net,  produto, cnpj)
investors_guia_fundos:       INDEX(cnpj,  liquidez_total)

你确定要那个WHERE子句吗?所有这些ORs都无关紧要,Riggs 的版本简化为

WHERE  investors_base_assessores.nome_investor = @investor_nome
  AND  investors_diversificacao.net > 0

求和前不要四舍五入;你会得到额外的舍入错误:

ROUND(SUM(IF(investors_diversificacao.produto = 'Fundos',
             investors_diversificacao.net, 0
            )
         ) / 6     -- divide after summing and before rounding
  , 2) AS fundos_ate_data

推荐阅读