问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sql 子查询优化

发布网友 发布时间:2022-05-02 01:41

我来回答

2个回答

懂视网 时间:2022-05-02 06:02

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

标签:子查询优化

热心网友 时间:2022-05-02 03:10

加并行可以不:/*parallel(+8)*/
或者你在外面再嵌套一个,里面的那2个子查询和主查询用union all 并列跑
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...开始是大腿内侧,后是大腿跟上,脖子后面,再就是肚子上,现在几乎... 工程土方定额里面:人力 运输距离 0.5km以内 20m以内是什么意思 ...由诸葛亮著的《诫子训》中摘录的,问您是如何理解的?! 手把手带你将 Linux 主机配置为静态路由器 Linux配置路由功能及添加静态路由 Linux模拟路由器从实现网络模拟到运行路由器linux模拟路由器 幼儿园中班学期结束家长会稿子怎么写 幼儿园中班期末家长会的发言稿 女人在哪个年龄段性俗最强 谁知道女人多大性欲最高? 我的电脑能装windows7吗? 我的电脑能装windows7吗? 怎么才能安装Windows7操作系统的啊?我的电脑也可以安装不? 我的电脑可以用U盘装WIN7系统吗 我的电脑能安装Windows7系统吗? 请问我的电脑能装win7吗? 我的电脑可以安装Windows 7吗? 我的电脑能装WINDOWS 7系统吗 我的电脑适合安装windows7吗? 从上海南站到惠州站t101车次14车019是窗户坐吗 请问北京西到重庆的临时列车哪有时刻表呀? 我这电脑配置能装windows7的系统吗? k101杭州停靠站是城站还是东站 我的电脑能不能装win7? 我的电脑可以装windows7系统吗? 襄樊至汉口的火车时刻表 请问上海南到深圳的火车经过哪几个站 自己的电脑能不能装Win7系统 我这电脑能用WIN7的系统吗 我的电脑能装windows7系统吗? 妊娠中期后,羊水的主要来源于 妊娠期羊水的主要来源是什么? 羊水叫法来源是什么? 羊水都有哪些作用 老师的胸罩如何脱掉啊 在上学的时,老师发生的最尴尬的事情是? 墙固在水电前还是后刷? 今天我看到音乐老师的胸罩的带子是穿在身上的。我想问一下为什么老师会穿成那样。 睡着胸罩被同桌脱掉不见 毛胚墙面要刷几遍墙固 墙固产品施工了解 求说唱坏学生歌词 LG洗衣机质量很差? 西安长电新能源科技有限公司怎么样? 重庆长电联合能源有限责任公司怎么样? 请问重庆市中涪南热电有限公司怎么样? 长江电力股票市盈率法估值 川投能源为什么比长江电力的股价低这么多 本人是新入市的股民买了3只股票都是不会动的中煤能源成本10.22长江电力成本8.22国栋建设成本6.72,请问高 LG洗衣机质量及售后服务如何? 微博对话怎么删除