幾個月前,咱們有個產品的開發反饋了個問題,說有個組織結構的查詢很慢,幾千行的複雜關聯須要1秒鐘,表示太慢了,原語句以下:oracle
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重寫以下:spa
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提示)。code