本帖最后由 qingyun 于 2013-4-2 17:39 编辑
效率测试
背景:
表 WCS_PLC_PCL 里有3000条数据左右; 字段 PLC_ITEM_NO 是主键;
其中有11条记录:
PLC_ITEM_NO
--------------------------------------
TC_M_ONCRANE_01
TC_M_ONCRANE_02
TC_M_ONCRANE_03
TC_M_ONCRANE_04
TC_M_ONCRANE_05
TC_M_ONCRANE_06
TC_M_ONCRANE_07
TC_M_ONCRANE_08
TC_M_ONCRANE_09
TC_M_ONCRANE_10
TC_M_ONCRANE_11
目的其实是这个:
SELECT LISTAGG(DVC_NO, ',') WITHIN GROUP(ORDER BY DVC_NO) FROM WCS_PLC_PCL WHERE PLC_ITEM_NO LIKE 'TC\_M\_ONCRANE\_%' ESCAPE '\';
实现有3种写法:
方法1:最传统的方法,一个一个取,要循环11次,但是为了测试效果,放到1万倍(执行时间 5.71秒;)
DECLARE
V_DVC_NO WCS_PLC_PCL.DVC_NO%TYPE;
BEGIN
FOR REC IN 1..110000
LOOP
SELECT DVC_NO INTO V_DVC_NO
FROM WCS_PLC_PCL WHERE PLC_ITEM_NO = 'TC_M_ONCRANE_02';
END LOOP;
END;
方法2:做个游标取,同样为了测试效果,放大1万倍(执行时间 1.08秒;)
DECLARE
V_DVC_NO WCS_PLC_PCL.DVC_NO%TYPE;
BEGIN
FOR REC IN 1..10000
LOOP
FOR R2 IN ( SELECT DVC_NO FROM WCS_PLC_PCL WHERE PLC_ITEM_NO LIKE 'TC\_M\_ONCRANE\_%' ESCAPE '\')
LOOP
V_DVC_NO:=R2.DVC_NO;
END LOOP;
END LOOP;
END;
/
方法3:用LISTAGG,同样为了测试效果,放大1万倍(执行时间 1.33秒;)
DECLARE
V_DVC_NO VARCHAR2(1000);
BEGIN
FOR REC IN 1..10000
LOOP
SELECT LISTAGG(DVC_NO, ',') WITHIN GROUP(ORDER BY DVC_NO) INTO V_DVC_NO
FROM WCS_PLC_PCL WHERE PLC_ITEM_NO LIKE 'TC\_M\_ONCRANE\_%' ESCAPE '\';
END LOOP;
END;
结论 :用游标取最快,用listagg最方便,一句话搞定;一条条取效率最低;