当前位置: 代码迷 >> Oracle管理 >> 【100分】这样的SQL再有可优化的空间吗
  详细解决方案

【100分】这样的SQL再有可优化的空间吗

热度:17   发布时间:2016-04-24 04:24:26.0
【100分】这样的SQL还有可优化的空间吗?
SELECT f.* FROM COM_FUNC f 
JOIN COM_FUNC_PRIV fp ON fp.FUNC_ID=f.ID
WHERE fp.USER_ID=:userID 
  UNION
SELECT f.* FROM COM_FUNC f
JOIN COM_FUNC_PRIV fp ON fp.FUNC_ID=f.ID
JOIN COM_ROLE_USER ru ON ru.ROLE_ID=fp.ROLE_ID
WHERE ru.USER_ID=:userID
  UNION
SELECT f.* FROM COM_FUNC f
JOIN COM_FUNC_PRIV fp ON fp.FUNC_ID=f.ID
JOIN COM_DEPT_USER du ON du.DEPT_ID=fp.DEPT_ID
WHERE du.USER_ID=:userID


还有一种是
SELECT f.* FROM COM_FUNC f 
JOIN COM_FUNC_PRIV fp1 ON fp1.FUNC_ID=f.ID

JOIN COM_FUNC_PRIV fp2 ON fp2.FUNC_ID=f.ID
JOIN COM_ROLE_USER ru ON ru.ROLE_ID=fp2.ROLE_ID

JOIN COM_FUNC_PRIV fp3 ON fp3.FUNC_ID=f.ID
JOIN COM_DEPT_USER du ON du.DEPT_ID=fp3.DEPT_ID
WHERE ru.USER_ID=:userID OR du.USER_ID=:userID

还有更好的办法吗?亲
------解决方案--------------------
1、把union可否改为union all
2、表的数据量是多少,相关字段是否都有建立索引
------解决方案--------------------
引用:
Quote: 引用:

1、把union可否改为union all
2、表的数据量是多少,相关字段是否都有建立索引

里面会有重复记录,用 all 达不到目的。
表的数据量挺大的。字段肯定都有索引了。


是否可以先union all 起来再去重复呢?

select *
  from table
 where rowid in (select max(rowid) from table group by col..)

------解决方案--------------------
不知道这样管用不

SELECT f.* FROM COM_FUNC f
WHERE EXISTS(SELECT 1 FROM COM_FUNC_PRIV fp1 WHERE fp1.FUNC_ID=f.ID AND fp1.USER_ID=:userID)
OR EXISTS(SELECT 1 FROM COM_FUNC_PRIV fp2 JOIN COM_ROLE_USER ru ON ru.ROLE_ID=fp2.ROLE_ID WHERE fp2.FUNC_ID=f.ID AND ru.USER_ID=:userID)
OR EXISTS(SELECT 1 FROM COM_FUNC_PRIV fp3 JOIN COM_DEPT_USER du ON du.DEPT_ID=fp3.DEPT_ID WHERE fp3.FUNC_ID=f.ID AND du.USER_ID=:userID)

------解决方案--------------------
楼主,不大明白你的业务逻辑。
从你的第一个SQL来理解,两个union后的查询结果完全是第一部分的子集,这样Union起来只是多了一部分重复数据而已。最好能把你的业务逻辑解释一下,以便判断。

------解决方案--------------------
。。。我的意思是你需要得到什么样的数据
  相关解决方案