SQL 逻辑优化 case when 转为 union all
Posted vansky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 逻辑优化 case when 转为 union all相关的知识,希望对你有一定的参考价值。
通常数据库的优化从硬件层面去考虑可分为4个方面:
CPU:即降低计算复杂度,如减少sql各类聚合函数,窗口函数,case when等。
IO :(较少查询结果集过程中对数据的访问量。数据优化很大程度从这里入手
网络 : 较少查询结果集的大小,去除不必要的查询字段
数据库资源 : 这里讲的数据库资源主要是数据的一些参数设置,如索引、数据缓存。锁的争用,死锁,锁等。 锁问题大部分从业务逻辑上去优化。如拆分事务,降低事务复杂度及事务中的表关联。做到少量多次提交。即让事务尽快完成,释放资源。另一方面,根据业务情况,使用满足需求的低隔离级别的读锁。在业务中对库表的操作尽量使用相同顺序。如相近业务中事务先查询T1表再查询T2表。(mysql中尽量避免使用 replace into .. ,insert into ... on dumplicate ...。并发时容易出现死锁)
举例:
SQL逻辑改写,减少cpu及io的使用:
case when 某些情况转为 union all
简写
SELECT * FROM (
....
(CASE WHEN a.updatetime>b.updatetime THEN a.updatetime ELSE b.updatetime END) as updatetime,
FROM a
LEFT JOIN b on b.ClientID = a.ClientID
) t
WHERE t.updatetime>=‘xxxxx‘
改写:
SELECT ....
a.updatetime AS updatetime ,
FROM a
LEFT JOIN b on b.ClientID = a.ClientID
WHERE a.updatetime>=‘xxxx‘ AND a.updatetime>b.UpdateTime
UNION ALL
SELECT ....
b.UpdateTime as updatetime ,
FROM a
LEFT JOIN b on b.ClientID = a.ClientID
WHERE b.UpdateTime>=‘xxxx‘ AND a.updatetime<=b.UpdateTime
以上是关于SQL 逻辑优化 case when 转为 union all的主要内容,如果未能解决你的问题,请参考以下文章
WebSQL 查询优化帮助 - CASE WHEN 使查询慢 400 毫秒
MySQL巧用sum,case...when...优化统计查询