有一个视图语句如下:CREATE OR REPLACE VIEW VIEW_ASSET_STATE AS
SELECT ASS.ASSET_ID,
ASS.ASSET_NO,
ass.setup_date,
ass.asset_type,
con.SEASON_TEMPLATE_ID,
con.MAINTAIN_TEMPLATE_ID,
con.CHECK_TEMPLATE_ID,
ass.engine_model,
RUN.RUN_ID run_state_id ,
RUN.RUN_NAME,
spec.asset_spec_name,
ASS.ASSET_MODEL,
SPEC.ASSET_TYPE_ID,
CD.REMARK,
ASS.BELONG_TO_GROUP,
dept.dept_id,
DEPT.DEPT_NAME,
FUN_GET_ASSET_HOUR(ASS.ASSET_NO) ASSET_HOURS,
fun_get_asset_czd(ass.ASSET_NO) CZD,
FUN_GET_ASSET_PRE_HOUR('1', ASS.ASSET_ID) ASSET_PRE_HOUR,
FUN_GET_ASSET_PRE_DATE('1', ASS.ASSET_ID) ASSET_PRE_DATE,
FUN_GET_ASSET_MAINTAIN_PARA(ASS.ASSET_ID, '1') ASSET_HOUR_CIRCLE,
FUN_GET_ASSET_MAINTAIN_PARA(ASS.ASSET_ID, '2') ASSET_CALENDER_CIRCLE FROM ASSET ASS,
PMIS.ASSET_SPEC SPEC,
CODE_DEPT DEPT,
CODE_DEF CD,
CODE_RUN_STATE RUN,
pmis.CODE_MAINTAIN_CONSIGN con
WHERE CD.CODE_FIELD = '设备类型'
AND
ASS.ASSET_SPEC_ID = SPEC.ASSET_SPEC_ID(+)
AND ASS.DEPT_ID = DEPT.dept_id(+)
AND ASS.RUN_STATE_ID = RUN.RUN_ID(+)
AND SPEC.ASSET_TYPE_ID = CD.CODE_ID(+)
AND SPEC.MAINTAIN_TYPE IS NOT NULL红色部分用的是函数,函数功能大体是根据每行某字段的值查询出其他值,
这样每条记录都要执行函数,当表中记录数多时,速度很慢,
有没有什么好的办法解决??? 是否可以把函数替换掉???
SELECT ASS.ASSET_ID,
ASS.ASSET_NO,
ass.setup_date,
ass.asset_type,
con.SEASON_TEMPLATE_ID,
con.MAINTAIN_TEMPLATE_ID,
con.CHECK_TEMPLATE_ID,
ass.engine_model,
RUN.RUN_ID run_state_id ,
RUN.RUN_NAME,
spec.asset_spec_name,
ASS.ASSET_MODEL,
SPEC.ASSET_TYPE_ID,
CD.REMARK,
ASS.BELONG_TO_GROUP,
dept.dept_id,
DEPT.DEPT_NAME,
FUN_GET_ASSET_HOUR(ASS.ASSET_NO) ASSET_HOURS,
fun_get_asset_czd(ass.ASSET_NO) CZD,
FUN_GET_ASSET_PRE_HOUR('1', ASS.ASSET_ID) ASSET_PRE_HOUR,
FUN_GET_ASSET_PRE_DATE('1', ASS.ASSET_ID) ASSET_PRE_DATE,
FUN_GET_ASSET_MAINTAIN_PARA(ASS.ASSET_ID, '1') ASSET_HOUR_CIRCLE,
FUN_GET_ASSET_MAINTAIN_PARA(ASS.ASSET_ID, '2') ASSET_CALENDER_CIRCLE FROM ASSET ASS,
PMIS.ASSET_SPEC SPEC,
CODE_DEPT DEPT,
CODE_DEF CD,
CODE_RUN_STATE RUN,
pmis.CODE_MAINTAIN_CONSIGN con
WHERE CD.CODE_FIELD = '设备类型'
AND
ASS.ASSET_SPEC_ID = SPEC.ASSET_SPEC_ID(+)
AND ASS.DEPT_ID = DEPT.dept_id(+)
AND ASS.RUN_STATE_ID = RUN.RUN_ID(+)
AND SPEC.ASSET_TYPE_ID = CD.CODE_ID(+)
AND SPEC.MAINTAIN_TYPE IS NOT NULL红色部分用的是函数,函数功能大体是根据每行某字段的值查询出其他值,
这样每条记录都要执行函数,当表中记录数多时,速度很慢,
有没有什么好的办法解决??? 是否可以把函数替换掉???
解决方案 »
- 跨数据库的触发器,如何实现?
- 高手,请帮忙,2个select结果集展示的我问题!
- 从一张表向另一张表复制数据的问题
- .net+oracle问题
- oracle增量备份问题
- 安装oracle10g时把密码设成了全数字,结果不能进入,具体该怎么办啊?。
- ORACLE中有临时表,表变量吗(SQLSERVER中),那用什么来代替啊
- 这样在unix server 下查看 server 上装的Oracle 版本号
- 突然停电ORACLE数据库起不来了,怎么办?紧急
- 紧急求助:这个关联的update语句究竟有什么问题????
- oracle分区表本地索引所在表空间 与 分区表的表空间能否不一致?
- DATE 类型上的索引
这样只能把你函数体里面的sql代码贴出来了,大家看下,没有具体函数内容,不好做优化。
CREATE OR REPLACE FUNCTION FUN_GET_ASSET_HOUR(VC_ASSET_ID IN VARCHAR2)
RETURN NUMBER IS
--获取最新的台时录入
NMAX_HOUR NUMBER(8,1);
BEGIN
--初始值为0
NMAX_HOUR := 0;
SELECT sum(v.SYGS)
INTO NMAX_HOUR
FROM PMIS.V_ASSET_TASK v
WHERE v.CH = replace(VC_ASSET_ID,'-','');
IF NMAX_HOUR>0 THEN
RETURN NMAX_HOUR;
ELSE
RETURN 0;
END IF;
END FUN_GET_ASSET_HOUR;函数的功能是,根据传入的设备号,从另一张表中取出该设备的总台时
Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
例如:
(低效,执行时间156.3秒)
SELECT …
FROM EMP E
WHERE SAL > 50000
AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO);
(高效,执行时间10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(*) FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000
AND JOB = ‘MANAGER’;
2.使用DECODE函数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
例如:
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0020
AND ENAME LIKE‘SMITH%’;
SELECT COUNT(*),SUM(SAL)
FROM EMP
WHERE DEPT_NO = 0030
AND ENAME LIKE‘SMITH%’;
你可以用DECODE函数高效地得到相同结果
SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT,
COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT,
SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
FROM EMP WHERE ENAME LIKE‘SMITH%’;
类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中