数据库

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

Oracle SQL性能优化系列学习三


发布日期:2023年10月11日
 
Oracle SQL性能优化系列学习三
正在看的ORACLE教程是:Oracle SQL性能优化系列学习三使用DECODE函数来减少处理时间

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表

例如:

SELECTCOUNT(*)SUM(SAL)FROMEMP

WHEREDEPT_NO=

ANDENAMELIKESMITH%;

SELECTCOUNT(*)SUM(SAL)

FROMEMP

WHEREDEPT_NO=

ANDENAMELIKESMITH%;

你可以用DECODE函数高效地得到相同结果

SELECTCOUNT(DECODE(DEPT_NOXNULL))D_COUNT

COUNT(DECODE(DEPT_NOXNULL))D_COUNT

SUM(DECODE(DEPT_NOSALNULL))D_SAL

SUM(DECODE(DEPT_NOSALNULL))D_SAL

FROMEMPWHEREENAMELIKESMITH%;

类似的DECODE函数也可以运用于GROUPBY和ORDERBY子句中

整合简单无关联的数据库访问

如果你有几个简单的数据库查询语句你可以把它们整合到一个查询中(即使它们之间没有关系)

例如:

SELECTNAMEFROMEMP

WHEREEMP_NO=;

SELECTNAMEFROMDPT

WHEREDPT_NO=;

SELECTNAMEFROMCAT

WHERECAT_TYPE=RD;

上面的个查询可以被合并成一个:

SELECTENAMEDNAMECNAMEFROMCATCDPTDEMPEDUALX

WHERENVL(XXDUMMY)=NVL(XEROWID(+))

ANDNVL(XXDUMMY)=NVL(XDROWID(+))

ANDNVL(XXDUMMY)=NVL(XCROWID(+))

ANDEEMP_NO(+)=

ANDDDEPT_NO(+)=

ANDCCAT_TYPE(+)=RD;

(译者按:虽然采取这种方法效率得到提高但是程序的可读性大大降低所以读者还是要权衡之间的利弊)

删除重复记录

最高效的删除重复记录方法(因为使用了ROWID)

DELETEFROMEMPE

WHEREEROWID>(SELECTMIN(XROWID)

FROMEMPX

WHEREXEMP_NO=EEMP_NO);

用TRUNCATE替代DELETE

当删除表中的记录时在通常情况下回滚段(rollbacksegments)用来存放可以被恢复的信息如果你没有COMMIT事务ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)而当运用TRUNCATE时回滚段不再存放任何可被恢复的信息当命令运行后数据不能被恢复因此很少的资源被调用执行时间也会很短(注TRUNCATE只在删除全表适用TRUNCATE是DDL不是DML)

尽量多使用COMMIT

只要有可能在程序中尽量多使用COMMIT这样程序的性能得到提高需求也会因为COMMIT所释放的资源而减少:

COMMIT所释放的资源:

a回滚段上用于恢复数据的信息

b被程序语句获得的锁

credologbuffer中的空间

dOracle为管理上述种资源中的内部花费

(注在使用COMMIT时必须要注意到事务的完整性现实中效率和事务完整性往往是鱼和熊掌不可得兼)

如果DECODE取值为NULLSUM(NULL)的值是NULL>如果所有的值都是NULLSUM(NULL)=NULL但是只要有一个值不是NULLSUM()<>NULL所以原SQL应该没有什么逻辑上的问题

关于第八点的个人看法如果DECODE取值为NULLSUM(NULL)的值是NULL不会正常求和的可以改成如下所示就好了SELECTCOUNT(DECODE(DEPT_NOXNULL))D_COUNTCOUNT(DECODE(DEPT_NOXNULL))D_COUNTSUM(DECODE(DEPT_NOSAL))D_SALSUM(DECODE(DEPT_NOSAL))D_SALFROMEMPWHEREENAMELIKESMITH%;

上一篇:如何查询占CPU高的oracle进程

下一篇:Oracle 数组的学习 小知识也要积累,养成好的学习态度