SQL优化-子查询&case&limit

load 导数据.notesdxtdb 数据库    total_time  475.60秒。 监控服务:仓颉

select t_.*,
 a.name acquirer_name,
m.merchant_name,
 am.merchant_name acq_merchant_name,
                   ag.name agency_name
            from
              (
            select t.* ,
                   c.cardbin_name,
                   c.issuer_name cardbin_issuer_name,
                   CASE c.card_type
                    WHEN ‘debit‘ THEN ‘XXX‘
                    WHEN ‘prepaid‘ THEN ‘XXX‘
                    WHEN ‘credit‘ THEN ‘XXX‘
                    WHEN ‘semiCredit‘ THEN ‘XXX‘
                   END ‘card_type‘
               from trans_history t
               join dict_cardbin c on t.cardbin_id = c.id
        where 1=1  order by t.id desc ) t_
            left join cm_merchant m on t_.merchant_id=m.id
            left join acquirer a on t_.acquirer_id = a.id
            left join acq_merchant am on t_.acq_merchant_id = am.id
            left join agency ag on m.agency_id = ag.id
         order by t_.id desc  limit 0, 20;

表:
trans_history t
子查询的 结果集是  t_
dict_cardbin c
cm_merchant m
acquirer a
acq_merchant am
agency ag

关联:
c on t.cardbin_id = c.id
t_.merchant_id=m.id
t_.acquirer_id = a.id
 t_.acq_merchant_id = am.id
m.agency_id = ag.id

子查询结果集要:
c.cardbin_name,
c.issuer_name
cardbin_issuer_name,

外部结果要:
t_.*,

c.cardbin_name,
c.issuer_name
 t.cardbin_issuer_name,
a.name acquirer_name,
m.merchant_name,
am.merchant_name
t.acq_merchant_name,
ag.name agency_name

以下SQL未经验证,全凭个人经验 对其SQL改写。
(刚来新公司,还没有权限登录 跟查验表结构 执行计划。)
目测 第一步设计的6个表的left join  以及判断
第二步  如这个查询业务功能上来说 属于频繁性的,需要设计视图方式解决。
视图采用 CASCADED 方式。

查询需要:
trans_history t  全字段数据;   其他表 都个需要某几个字段数据。

select t.*,c.cardbin_name,c.issuer_name,t.cardbin_issuer_name,a.name acquirer_name,m.merchant_name,am.merchant_name,t.agency_name from ((((trans_history t join dict_cardbin c on t.cardbin_id = c.id ) left join cm_merchant m on t.merchant_id=m.id) left join acquirer a on t.acquirer_id = a.id ) left join acq_merchant am on t.acq_merchant_id = am.id ) left join agency ag on m.agency_id = ag.id order by t.id desc  limit 0, 20;

card_type 列要做运算。这里 应该存 enum  0;1;2;3 这样的字段,逻辑端拿到数值,前端做渲染。  否则 这个CASE 没办法在第一个版本当中优化掉。
card_type 字段,我这里就简写了。没有加入case 判断。

select t.*,c.cardbin_name,c.issuer_name,a.name,acquirer_name,m.merchant_name,am.merchant_name,t.agency_name from ((((trans_history t join dict_cardbin c on t.cardbin_id = c.id ) left join cm_merchant m on t.merchant_id=m.id) left join acquirer a on t.acquirer_id = a.id ) left join acq_merchant am on t.acq_merchant_id = am.id ) left join agency ag on m.agency_id = ag.id order by t.id desc  limit 0, 20;

select t.*,c.cardbin_name,c.issuer_name,t.cardbin_issuer_name,c.card_type,a.name acquirer_name,m.merchant_name,am.merchant_name,t.agency_name from ((((trans_history t join dict_cardbin c on t.cardbin_id = c.id ) left join cm_merchant m on t_.merchant_id=m.id) left join acquirer a on t_.acquirer_id = a.id ) left join acq_merchant am on t_.acq_merchant_id = am.id ) left join agency ag on m.agency_id = ag.id order by t.id desc  where id >0 limit 20;

视图方式:
LOCAL只要满足本视图的条件就可以更新;
CASCADED则必须满足所有针对该视图的所有视图的条件才可以更新

create view card as select t.*,c.cardbin_name,c.issuer_name,t.cardbin_issuer_name,a.name acquirer_name,m.merchant_name,am.merchant_name,t.agency_name from ((((trans_history t join dict_cardbin c on t.cardbin_id = c.id ) left join cm_merchant m on t_.merchant_id=m.id) left join acquirer a on t_.acquirer_id = a.id ) left join acq_merchant am on t_.acq_merchant_id = am.id ) left join agency ag on m.agency_id = ag.id with local check option;

解决哪些问题:
1 解决了 表结构类型的问题。使用了enum  并利用前端做判断展示出来。
2 解决了子查询 用left join方式替换。
3 解决了limit 查询效率差的问题,用where 解决。

SQL优化-子查询&case&limit

时间: 2024-10-23 13:16:58

SQL优化-子查询&case&limit的相关文章

SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)

SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5.在SELECT子句中使用子查询 6.WITH子句 子查询(进阶) 7.分析函数 8.行列转换 9.设置数据层次 八.行列转换 pivot和unpivot函数是Oracle 11g增加的新函数,利用此函数可以实现行列转换操作 按照原始方式实现,使用通用函数中的DECODE()函数 列字段的处理 SQ

SQL用子查询结果更新多个字段

作者:iamlasong 要求:表格的内容需要变更,变更的内容放在一个临时表中,用SQL语句更新正式表中多个字段. 如果更新一个字段,直接用字段名=子查询就可以了,多个字段更新,将字段在括号中并列写出即可,如下: update tb_jg t set t.jgfl = 'sd', (     t.zj_code, t.zj_mc) = (select a.zj_code, a.zj_mc from song_temp a where a.zj_code = t.zj_code) where ex

SQL 基础--> 子查询

--========================= --SQL 基础--> 子查询 --========================= 一.子查询 子查询就是位于SELECT.UPDATE.或DELETE语句中内部的查询 二.子查询的分类 单行子查询 返回零行或一行 多行子查询 返回一行或多行 多列子查询 返回多列 相关子查询 引用外部SQL语句中的一列或多列 嵌套子查询 位于其它子查询中的查询 三.子查询语法 SQL> SELECT select_list FROM table WH

优化子查询sql语句为内连接

背景: 希望提高查询的效率,从sql语句中频繁出现的子查询入手. 数据表如下:Student表中的CityCode对应于City表中的Code. Student表:                      City表: 子查询方式: sql语句如下: 1 select * from Student 2 where CityCode 3 in 4 (select Code from City) 内连接方式:sql语句如下: 1 select a.* from 2 Student a inner

MySQL5.7性能优化系列(二)——SQL语句优化(3)——使用物化策略优化子查询

优化器使用物化策略(Materialization)来实现更有效的子查询处理.通过生成子查询结果作为临时表,通常在内存中,实现加速查询执行. MySQL首次需要子查询结果,将该结果实现为临时表.任何随后的结果都需要,MySQL再次指向临时表.优化器可以使用散列索引对表进行索引,以使查找更加快速和便宜.该索引是唯一的,它消除了重复,并使表格更小. 子查询实现可能时使用内存中临时表,如果表变得太大,则返回到磁盘存储. 如果不使用物化策略,则优化器有时将非相关子查询重写为相关子查询.例如,以下IN子查

基本sql语句--子查询

子查询有三种:where型子查询,from型子查询,exist子查询. where型子查询 where子查询:指把内层的查询结果当成外层查询的比较条件. 例句:查询出最新的商品:select good_id,good_name from good where good_id = (select max(good_id) from good);--此句为子查询 select good_id,good_name from good order by good_id DESC limit 1; fro

SQL Server子查询填充DataSet时报500内部错误的解决办法

运行环境为Visual Studio 2010,数据库为SQL Server 2008. 执行下面SQL语句 SELECT SubsiteId, SubsiteTitle, count(CollectionID) CollectionNumber,count(LName) PlantNumber FROM (SELECT DISTINCT SubsiteId, SubsiteTitle, CollectionID, LName, CName FROM Cumplag_Garden_Plants

ThinkPHP3.2 SQL alias 子查询

SELECT info_key, info_value, info_status, edit_time FROM (SELECT * FROM `detail` WHERE login = '[email protected]' ORDER BY edit_time DESC  ) AS aaa GROUP BY info_key 希望通过Thinkphp实现基于alias的子查询,终于参考下面这个文章实现了. http://www.thinkphp.cn/update/122.html 如下是

Mysql 查询技巧:使用JOIN优化子查询

1.数据准备 mysql> select * from student; +----+--------+----------+---------+-------------+ | id | name   | idCardNo | isCadre | nickname    | +----+--------+----------+---------+-------------+ |  1 | Tom    | 350020   |       1 | Big T       | |  2 | Ji