几个月前,我们有个产品的开发反馈了个问题,说有个组织结构的查询很慢,几千行的复杂关联需要1秒钟,表示太慢了,原语句如下:

  1. SELECT
  2. org.org_id,
  3. org.dimension,
  4. org.org_code,
  5. org.org_name,
  6. org.parent_id,
  7. org.manage_id,
  8. org.org_cate,
  9. org.org_level,
  10. org.org_order,
  11. org.org_path,
  12. org.position_code,
  13. org.ext_id,
  14. org.remark,
  15. pos.position_name,
  16. parent.org_code AS parent_code,
  17. parent.org_name AS parent_name,
  18. manage.org_code AS manage_code,
  19. manage.org_name AS manage_name,
  20. org. STATUS
  21. FROM
  22. tsys_organization org
  23. LEFT JOIN tsys_position pos ON org.position_code = pos.position_code
  24. LEFT JOIN tsys_organization parent ON org.parent_id = parent.org_id
  25. LEFT JOIN tsys_organization manage ON org.manage_id = manage.org_id
  26. WHERE
  27. org.org_id IN(
  28. SELECT
  29. org.org_id
  30. FROM
  31. tsys_organization org
  32. JOIN tsys_user us ON us.user_id ='admin'
  33.  
  34. UNION
  35. SELECT
  36. ou.org_id
  37. FROM
  38. tsys_org_user ou
  39. WHERE
  40. user_id ='admin'
  41. UNION
  42. SELECT
  43. org.org_id
  44. FROM
  45. tsys_organization org
  46. JOIN pos_user_view po ON po.user_id ='admin'
  47. )
  48. AND org. STATUS = 0
  49. ORDER BY
  50. org.org_order

够复杂的,看了下执行计划,确实有个子句没有物化导致i/o访问次数下不来,于是对该子查询使用with重写如下:

  1. with a as (
  2. SELECT
  3. org2.org_id
  4. FROM
  5. tsys_organization org2
  6. JOIN tsys_user us ON us.user_id ='admin'
  7.  
  8. UNION all
  9. SELECT
  10. ou.org_id
  11. FROM
  12. tsys_org_user ou
  13. WHERE
  14. user_id ='admin'
  15. UNION all
  16. SELECT
  17. org1.org_id
  18. FROM
  19. tsys_organization org1
  20. JOIN pos_user_view po ON po.user_id ='admin'
  21. )
  22. SELECT
  23. org.org_id,
  24. org.dimension,
  25. org.org_code,
  26. org.org_name,
  27. org.parent_id,
  28. org.manage_id,
  29. org.org_cate,
  30. org.org_level,
  31. org.org_order,
  32. org.org_path,
  33. org.position_code,
  34. org.ext_id,
  35. org.remark,
  36. pos.position_name,
  37. parent.org_code AS parent_code,
  38. parent.org_name AS parent_name,
  39. manage.org_code AS manage_code,
  40. manage.org_name AS manage_name,
  41. org. STATUS
  42. FROM
  43. tsys_organization org
  44. LEFT JOIN tsys_position pos ON org.position_code = pos.position_code
  45. LEFT JOIN tsys_organization parent ON org.parent_id = parent.org_id
  46. LEFT JOIN tsys_organization manage ON org.manage_id = manage.org_id
  47. WHERE
  48. org.org_id IN (select org_id from a)
  49. AND org. STATUS = 0
  50. ORDER BY
  51. org.org_order

因为mariadb的with子句会强制物化为临时表,改写后,0.2秒执行完成(oracle 12.2开始也支持强制,在此之前需要加materialized提示)。

mariadb使用with子句重写SQL性能提升5倍的更多相关文章

  1. 一次 Spark SQL 性能提升10倍的经历(转载)

    1. 遇到了啥问题 是酱紫的,简单来说:并发执行 spark job 的时候,并发的提速很不明显. 嗯,且听我慢慢道来,啰嗦点说,类似于我们内部有一个系统给分析师用,他们写一些 sql,在我们的 sp ...

  2. Web 应用性能提升 10 倍的 10 个建议

    转载自http://blog.jobbole.com/94962/ 提升 Web 应用的性能变得越来越重要.线上经济活动的份额持续增长,当前发达世界中 5 % 的经济发生在互联网上(查看下面资源的统计 ...

  3. 重构、插件化、性能提升 20 倍,Apache DolphinScheduler 2.0 alpha 发布亮点太多!

    点击上方 蓝字关注我们 社区的小伙伴们,好消息!经过 100 多位社区贡献者近 10 个月的共同努力,我们很高兴地宣布 Apache DolphinScheduler 2.0 alpha 发布.这是 ...

  4. 有史以来性价比最高最让人感动的一次数据库&SQL优化(DB & SQL TUNING)——半小时性能提升千倍

    昨天,一个客户现场人员急急忙忙打电话找我,说需要帮忙调优系统,因为经常给他们干活,所以,也就没多说什么,先了解情况,据他们说,就是他们的系统最近才出现了明显的反应迟钝问题,他们的那个系统我很了解,软硬 ...

  5. 查询性能提升3倍!Apache Hudi 查询优化了解下?

    从 Hudi 0.10.0版本开始,我们很高兴推出在数据库领域中称为 Z-Order 和 Hilbert 空间填充曲线的高级数据布局优化技术的支持. 1. 背景 Amazon EMR 团队最近发表了一 ...

  6. 在MongoDB中创建一个索引而性能提升1000倍的小例子

    在https://www.cnblogs.com/xuliuzai/p/9965229.html的博文中我们介绍了MongoDB的常见索引的创建语法.部分同学还想看看MongoDB的威力到底有多大,所 ...

  7. 如何利用缓存机制实现JAVA类反射性能提升30倍

    一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> ...

  8. 存算分离下写性能提升10倍以上,EMR Spark引擎是如何做到的?

    ​引言 随着大数据技术架构的演进,存储与计算分离的架构能更好的满足用户对降低数据存储成本,按需调度计算资源的诉求,正在成为越来越多人的选择.相较 HDFS,数据存储在对象存储上可以节约存储成本,但与此 ...

  9. Nacos 2.0 正式发布,性能提升 10 倍!!

    3月20号,Nacos 2.0.0 正式发布了! Nacos 简介: 一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. 通俗点讲,Nacos 就是一把微服务双刃剑:注册中心 + 配置中 ...

随机推荐

  1. 移动端H5长按事件 vue自定义指令

    import Vue from 'vue' Vue.directive('longpress', function (el, binding){ var timer = null; var start ...

  2. vue.js下移动端绑定click事件失效,pc端正常的问题

    原因可能是 我在项目中使用到了 better-scroll,默认它会阻止 touch 事件.所以在配置中需要加上 click: true 即可. 例如: mounted () { this.scrol ...

  3. 04-JavaScript的操作

    本篇主要介绍获取元素的方法.操作元素.数组和字符串的操作方法.定时器和封闭函数.以及贪吃蛇案例: 一.获取元素的方法 1.document.getElementById:可以使用内置对象documen ...

  4. 微信支付之获取openid

    一.准备工具 不管开发什么,官方的文档应该是第一个想到的这里把官方文档贴出来:微信网页授权文档除此之外,我们还需要一个内网穿透的工具在开发环境下让微信能访问到我们的域名.我使用的是natapp.此类工 ...

  5. 编程小白入门分享二:IntelliJ IDEA的入门操作小知识

    idea简介 IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支 ...

  6. Tortoise Git 安装 及报错处理

    TortoiseGit安装详解: https://www.cnblogs.com/xinlj/p/5978730.html Tortoise Git 错误处理 disconnected no supp ...

  7. Vue移动端项目如何使用手机预览调试

  8. 使用docker来创建一个etcd集群

    docker run -d --name etcd1 --network etcdnet --ip 172.25.0.101 -p 23791:2379 -e ETCDCTL_API=3 -v /ro ...

  9. c++ 去掉所有空格及换行符

    string get_string(string res){ //删除换行符 int r = res.find('\r\n'); while (r != string::npos) { if (r ! ...

  10. .net web开发——文件的上传和下载

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...