数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle语句优化30个规则详解(6)


发布日期:2022年11月09日
 
Oracle语句优化30个规则详解

减少对表的查询

在含有子查询的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往往牺牲了执行效率 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的)

上一篇:配置OracleEnterpriseManager过程总结

下一篇:Oracle 10g学习手册2:安装与构建三(图)