减少对表的查询
在含有子查询的SQL语句中要特别注意减少对表的查询
例如
低效
SELECTTAB_NAME
FROMTABLES
WHERETAB_NAME=(SELECTTAB_NAME
FROMTAB_COLUMNS
WHEREVERSION=)
ANDDB_VER=(SELECTDB_VER
FROMTAB_COLUMNS
WHEREVERSION=)
高效
SELECTTAB_NAME
FROMTABLES
WHERE(TAB_NAMEDB_VER)
=(SELECTTAB_NAMEDB_VER)
FROMTAB_COLUMNS
WHEREVERSION=)
Update多个Column例子
低效
UPDATEEMP
SETEMP_CAT=(SELECTMAX(CATEGORY)FROMEMP_CATEGORIES)
SAL_RANGE=(SELECTMAX(SAL_RANGE)FROMEMP_CATEGORIES)
WHEREEMP_DEPT=;
高效
UPDATEEMP
SET(EMP_CATSAL_RANGE)
=(SELECTMAX(CATEGORY)MAX(SAL_RANGE)
FROMEMP_CATEGORIES)
WHEREEMP_DEPT=;
通过内部函数提高SQL效率
SELECTHEMPNOEENAMEHHIST_TYPETTYPE_DESCCOUNT(*)
FROMHISTORY_TYPETEMPEEMP_HISTORYH
WHEREHEMPNO=EEMPNO
ANDHHIST_TYPE=THIST_TYPE
GROUPBYHEMPNOEENAMEHHIST_TYPETTYPE_DESC;
通过调用下面的函数可以提高效率
FUNCTIONLOOKUP_HIST_TYPE(TYPINNUMBER)RETURNVARCHAR
AS
TDESCVARCHAR();
CURSORCIS
SELECTTYPE_DESC
FROMHISTORY_TYPE
WHEREHIST_TYPE=TYP;
BEGIN
OPENC;
FETCHCINTOTDESC;
CLOSEC;
RETURN(NVL(TDESC?));
END;
FUNCTIONLOOKUP_EMP(EMPINNUMBER)RETURNVARCHAR
AS
ENAMEVARCHAR();
CURSORCIS
SELECTENAME
FROMEMP
WHEREEMPNO=EMP;
BEGIN
OPENC;
FETCHCINTOENAME;
CLOSEC;
RETURN(NVL(ENAME?));
END;
SELECTHEMPNOLOOKUP_EMP(HEMPNO)
HHIST_TYPELOOKUP_HIST_TYPE(HHIST_TYPE)COUNT(*)
FROMEMP_HISTORYH
GROUPBYHEMPNOHHIST_TYPE;
(译者按 经常在论坛中看到如 能不能用一个SQL写出… 的贴子 殊不知复杂的SQL往往牺牲了执行效率 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的)