|
现有视图如下,其功能相当于oracle的start with... connect by...(展现每个节点的所有上层节点串)
create view V_SYS_ORG_LVL_O as
WITH n(ORGANIZE_ID,ORGANIZE_NAME,PARENT_ORGANIZE_ID,ORG_LEVEL,ORG_AREA_TYPE,ORG_COOP_TYPE,STATE,level,chain)
AS (
SELECT ORGANIZE_ID,ORGANIZE_NAME,PARENT_ORGANIZE_ID,ORG_LEVEL,ORG_AREA_TYPE,ORG_COOP_TYPE,STATE,1,'#' || CAST(char(int(ORGANIZE_ID)) AS VARCHAR(300))
FROM SYS_ORGANIZE a WHERE PARENT_ORGANIZE_ID=-1
UNION ALL
SELECT a.ORGANIZE_ID,a.ORGANIZE_NAME,a.PARENT_ORGANIZE_ID,a.ORG_LEVEL,a.ORG_AREA_TYPE,a.ORG_COOP_TYPE,a.STATE,n.level + 1, n.chain || '#' || char(int(a.ORGANIZE_ID))
FROM SYS_ORGANIZE a, n
WHERE n.ORGANIZE_ID = a.PARENT_ORGANIZE_ID
)
SELECT ORGANIZE_ID,ORGANIZE_NAME,PARENT_ORGANIZE_ID,ORG_LEVEL,ORG_AREA_TYPE,ORG_COOP_TYPE,STATE,level ACT_ORG_LVL,REPLACE(chain,' ','') || '#' ORG_PATH
FROM n;
当直接查询V_SYS_ORG_LVL_O时,速度很快。
但当把该视图作为一个子查询时,例如 select * from tab_a a,V_SYS_ORG_LVL_O b where a.col=b.col
速度很慢(当使用笔记本本机数据库时,会基本很难查询出来,而使用服务器数据库时,大概会用半分钟左右),
且查询解析计划时会说是递归错误(递归公共表表达式 "N" 可能包含无限循环).
这时如果把视图改为表,即创建表T_SYS_ORG_LVL_O ,再 insert into T_SYS_ORG_LVL_O select * from V_SYS_ORG_LVL_O
再查询select * from tab_a a,T_SYS_ORG_LVL_O b where a.col=b.col,则速度很快。
这个问题应该就出在这个递归子查询上,请问有没有办法进行优化?迷茫中 |
|