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

SELECT
org.org_id,
org.dimension,
org.org_code,
org.org_name,
org.parent_id,
org.manage_id,
org.org_cate,
org.org_level,
org.org_order,
org.org_path,
org.position_code,
org.ext_id,
org.remark,
pos.position_name,
parent.org_code AS parent_code,
parent.org_name AS parent_name,
manage.org_code AS manage_code,
manage.org_name AS manage_name,
org. STATUS
FROM
tsys_organization org
LEFT JOIN tsys_position pos ON org.position_code = pos.position_code
LEFT JOIN tsys_organization parent ON org.parent_id = parent.org_id
LEFT JOIN tsys_organization manage ON org.manage_id = manage.org_id
WHERE
org.org_id IN(
SELECT
org.org_id
FROM
tsys_organization org
JOIN tsys_user us ON us.user_id ='admin' UNION
SELECT
ou.org_id
FROM
tsys_org_user ou
WHERE
user_id ='admin'
UNION
SELECT
org.org_id
FROM
tsys_organization org
JOIN pos_user_view po ON po.user_id ='admin'
)
AND org. STATUS = 0
ORDER BY
org.org_order

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

with a as (
SELECT
org2.org_id
FROM
tsys_organization org2
JOIN tsys_user us ON us.user_id ='admin' UNION all
SELECT
ou.org_id
FROM
tsys_org_user ou
WHERE
user_id ='admin'
UNION all
SELECT
org1.org_id
FROM
tsys_organization org1
JOIN pos_user_view po ON po.user_id ='admin'
)
SELECT
org.org_id,
org.dimension,
org.org_code,
org.org_name,
org.parent_id,
org.manage_id,
org.org_cate,
org.org_level,
org.org_order,
org.org_path,
org.position_code,
org.ext_id,
org.remark,
pos.position_name,
parent.org_code AS parent_code,
parent.org_name AS parent_name,
manage.org_code AS manage_code,
manage.org_name AS manage_name,
org. STATUS
FROM
tsys_organization org
LEFT JOIN tsys_position pos ON org.position_code = pos.position_code
LEFT JOIN tsys_organization parent ON org.parent_id = parent.org_id
LEFT JOIN tsys_organization manage ON org.manage_id = manage.org_id
WHERE
org.org_id IN (select org_id from a)
AND org. STATUS = 0
ORDER BY
org.org_order

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

最新文章

  1. JAVA_HOME环境变量失效的解决办法
  2. Photoshop 融合属性 Unity Shader
  3. 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
  4. Vmware workstation 10 NAT功能总是不正常的原因
  5. SharpGL学习笔记(十五) 纹理映射
  6. matplotlib库的常用知识
  7. java 导入包(误区)
  8. Eliza Doolittle lyrics Big City
  9. Delphi 利用TComm组件 Spcomm 实现串行通信
  10. Android 仿网易新闻v3.5:上下滑动的引导页
  11. 用vue实现简单实时汇率计算功能
  12. wpf listview 行变色
  13. WPF ResourceDictionary 主题资源替换(一)
  14. Django(五)母版继承、Cookie、视图装饰器等
  15. 版本控制commit和update过程
  16. 『TensorFlow』读书笔记_VGGNet
  17. OpenCV设置保存图像压缩率
  18. offset[Parent/Width/Height/Top/Left] 、 client[Width/Height/Top/Left] 、 Element.getBoundingClientRect()
  19. Python_01 执行方式、解释器路径、编码、变量、条件语句
  20. Android组件化之终极方案

热门文章

  1. js设置页面全屏
  2. StringUtils系列之StringUtils.isNotBlank()和StringUtils.isNotBlank()的区别
  3. Python类的__new__()
  4. Linux IO 概念(1)
  5. xtrbackup备份,及恢复数据
  6. ztree根据关键字模糊搜索
  7. mysql数据库的concat(),group_concat(),concat_ws()函数,三者之间的比较
  8. ccf算法模板
  9. Windows 2008R2 定时备份PostgreSQL 11.6及还原操作
  10. vue+elementUI完成注册及登陆