【发布时间】:2021-11-21 18:38:57
【问题描述】:
我想优化我的 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
【问题讨论】:
-
您的
where标准逻辑不明确 - 将单个子句括起来没有任何意义,我怀疑您需要对您的和/或布尔表达式进行逻辑分组。 -
您的查询无效。因此,与其担心它的性能,不如担心它是否正确。您显然处于 MySQL 臭名昭著的作弊模式中,否则您会遇到应有的语法错误。确保
SET sql_mode = 'ONLY_FULL_GROUP_BY';退出这种有害的作弊模式。看看你的查询。您按客户分组,但您从各种表中选择列。所有这些表是否每个客户端只有一行?我对此表示怀疑。 -
请告诉我们所有表的唯一键是什么。例如,
cod_cliente在investors_positivador中是唯一的吗?investors_positivador或investors_saldo_financeiro两个表中的哪一个包含列cod_assessor? -
@RiggsFolly:OR 的缩进令人困惑。它在原始请求中不存在,他们提出了不同的逻辑,然后实际上在查询中以及 OP 可能想要什么。毕竟 where 子句在
(name match and saldo > 0) or (name match and finance > 0) or (name match and net > 0)上,这更有意义(尽管它当然可以简化)。我认为括号可能会使这一点更清楚,但它们不是必需的。除非 OP 真的想要不同的逻辑。 -
@The Impaler:这不是真的。
AND优先于OR,所以WJHERE子句实际上是where iba..nome_investor = @investor_nome AND (isf..saldo_d0 > 0 OR ipg..financeiro > 0 OR id..net > 0)。这不会将外部连接变为内部连接。不要让 RiggsFolly 的编辑使用错误的缩进s ofAND` 和OR让您感到困惑。
标签: mysql sql query-optimization