有一个SQL实在看不出来该怎么优化了,求大神指条明路。

德忱 2016-08-24 04:34:49

SELECT
t.`userName` 申请人姓名,
t.`userPhone` 申请人手机号,
d.city 公寓所在城市,
CASE
WHEN d.topCompanyId IS NULL OR d.topCompanyId=1 THEN d.briefName
ELSE d.topCompanyName
END AS 申请公寓,
t.`loanMoney`/100 借款金额,
t.loanLease 借款总期数,
a.createTime 放款时间,
CASE
WHEN t.`rentStartDate` IS NOT NULL THEN t.`rentStartDate`
ELSE e.payDate
END AS 首次还款时间,
CASE
WHEN t.orderStatus=4100 THEN t.`loanMoney`/100-e.payAmount
WHEN t.orderStatus=6000 THEN SUBSTRING_INDEX(f.checkRecord,',',1)
ELSE 0
END AS 贷款余额,
CASE
WHEN t.orderStatus=4100 THEN '还款中'
WHEN t.orderStatus=5100 THEN '已还清'
WHEN t.orderStatus=6000 THEN '清退未结清'
ELSE '清退已结清'
END AS 订单状态
FROM
t_yuefu_v4_agentorder t
LEFT JOIN (
SELECT b.orderId,MIN(b.payDate) AS payDate,
SUM(CASE WHEN b.recordStatus >= 0 AND b.payStatus= 1 THEN b.payAmount / 100 ELSE 0 END) AS payAmount
FROM t_yuefu_v4_billcheck b
GROUP BY b.orderId) e ON e.orderId=t.id
LEFT JOIN t_yuefu_v4_orderLog a ON a.orderId=t.id AND a.checkStep=4100 AND a.recordStatus>= 0
LEFT JOIN t_yuefu_v4_orderLog f ON f.orderId=t.id AND f.checkStep=6000 AND f.recordStatus>= 0
LEFT JOIN t_yuefu_v4_orderLog b ON t.id = b.orderId AND b.checkStep=6100 AND b.recordStatus>= 0
JOIN t_yuefu_v4_agentcompany d ON t.companyId = d.id AND d.recordStatus>=0
LEFT JOIN (
SELECT b.orderId, b.realPayDate
FROM t_yuefu_v4_billcheck b WHERE b.period=b.totalPeriods
) g ON g.orderId=t.id
WHERE
t.recordStatus >= 0
AND (t.orderStatus IN (4100,6000) OR
(t.orderStatus=5100 AND g.realPayDate>='20160801') OR
(t.orderStatus=6100 AND b.createTime>='20160801'))
ORDER BY t.createTime;



这段SQL总是超时,求大神给看看,该怎么优化
...全文
137 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2016-08-25
  • 打赏
  • 举报
回复
引用 4 楼 u014440417 的回复:
[quote=引用 3 楼 kk185800961 的回复:] 1. 别名 b和g表改为 inner join 连接:
INNER JOIN t_yuefu_v4_orderLog b ON t.id = b.orderId AND b.checkStep=6100 AND b.recordStatus>= 0
JOIN t_yuefu_v4_agentcompany d ON t.companyId = d.id AND d.recordStatus>=0
INNER JOIN (
                    SELECT b.orderId, b.realPayDate
                    FROM t_yuefu_v4_billcheck b WHERE b.period=b.totalPeriods
                    ) g ON g.orderId=t.id
2. 表及字段 t_yuefu_v4_agentorder(orderStatus,createTime) 可以增加一个索引。但where 中的 or 有可能导致使用不了索引,改为 union 上下合并结果集。 表t_yuefu_v4_billcheck(orderId) 可以增加索引。
谢谢您的指点。 但是现在一切对于数据库结构的操作都不可能,没有权限。[/quote] 又要马儿跑, 又要马儿不吃草, 哪有那么好的事? 要承担责任就得有权限, 权限的问题大胆要
giftsf 2016-08-24
  • 打赏
  • 举报
回复
or 用unoin all 替换
薛定谔的DBA 2016-08-24
  • 打赏
  • 举报
回复
请你们的DBA来优化吧。
德忱 2016-08-24
  • 打赏
  • 举报
回复
引用 3 楼 kk185800961 的回复:
1. 别名 b和g表改为 inner join 连接:
INNER JOIN t_yuefu_v4_orderLog b ON t.id = b.orderId AND b.checkStep=6100 AND b.recordStatus>= 0
JOIN t_yuefu_v4_agentcompany d ON t.companyId = d.id AND d.recordStatus>=0
INNER JOIN (
                    SELECT b.orderId, b.realPayDate
                    FROM t_yuefu_v4_billcheck b WHERE b.period=b.totalPeriods
                    ) g ON g.orderId=t.id
2. 表及字段 t_yuefu_v4_agentorder(orderStatus,createTime) 可以增加一个索引。但where 中的 or 有可能导致使用不了索引,改为 union 上下合并结果集。 表t_yuefu_v4_billcheck(orderId) 可以增加索引。
谢谢您的指点。 但是现在一切对于数据库结构的操作都不可能,没有权限。
薛定谔的DBA 2016-08-24
  • 打赏
  • 举报
回复
1. 别名 b和g表改为 inner join 连接:
INNER JOIN t_yuefu_v4_orderLog b ON t.id = b.orderId AND b.checkStep=6100 AND b.recordStatus>= 0
JOIN t_yuefu_v4_agentcompany d ON t.companyId = d.id AND d.recordStatus>=0
INNER JOIN (
                    SELECT b.orderId, b.realPayDate
                    FROM t_yuefu_v4_billcheck b WHERE b.period=b.totalPeriods
                    ) g ON g.orderId=t.id
2. 表及字段 t_yuefu_v4_agentorder(orderStatus,createTime) 可以增加一个索引。但where 中的 or 有可能导致使用不了索引,改为 union 上下合并结果集。 表t_yuefu_v4_billcheck(orderId) 可以增加索引。
德忱 2016-08-24
  • 打赏
  • 举报
回复
引用 1 楼 TurboWay 的回复:
索引优化:这个可以看看语句的 执行计划,里面一般会给你提供一个索引优化的方向。 语句优化:光看这个语句的话,如果 e,g 这两个子查询的计算量是比较大的,那么建议 先把他们分别写到 临时表 再关联临时表查询,可以提高查询速度
业务的需求是将这个SQL传入后台的接口,返回上面的那些结果,权限不允许建临时表,只能考虑语句优化
TurboWay 2016-08-24
  • 打赏
  • 举报
回复
索引优化:这个可以看看语句的 执行计划,里面一般会给你提供一个索引优化的方向。 语句优化:光看这个语句的话,如果 e,g 这两个子查询的计算量是比较大的,那么建议 先把他们分别写到 临时表 再关联临时表查询,可以提高查询速度

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧