4、设计规范要点.pptx

4、设计规范要点

;内容提要;锁的作用:维护数据一致性,控制数据并发性 事务 日志 锁分类 锁的对象(行、块、表、数据分区、表空间、缓冲池) 锁的模式(S、X….) ;锁的模式(表锁) ;锁的模式(行锁) ;锁的几种现象 锁等待 锁超时 死锁 锁升级 锁转换 锁产生的问题 系统运行慢 应用回滚 ;锁是症状,不是根源,那什么是根源? ;可重复读 (RR) :在我任务未提交之前,任何人不能动数据(更新、删除、插入) 。 读稳定性 (RS) :在我任务未提交之间,我已经检索的行不能动(更新、删除),但是可以插入行(满足检查条件的行)。 游标稳定性 (CS) (默认隔离级别):在我更新某行时(游标定位某行),其它人不能更新或删除该行。在CS下无法访问其他人未落实的数据。 未落实的读 (UR):可访问其他人未落实的数据。 最严格的隔离级别是?最宽松的隔离级别是?我们究竟需要使用哪种隔离级别? ??议:在保证业务逻辑允许的情况下,使用合理的隔离级别(例如:UR隔离级别)来最大程度上提高数据库的并发。;1、insert语句指定列名; INSERT INTO EMPLOYEE (EMP_ID,EMP_NAME) VALUES (‘001’,’张三’); 与INSERT INTO EMPLOYEE VALUES (‘001’,’张三’); 2、SELECT子句中通过指定列名的方式避免使用‘*’;在解析的过程中, 会将‘*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。 3、当在SQL语句中连接多个表时, 是否定义了表的别名,并把把别名前缀于每个Column上;此用法一是为了提高数据库的解析性能,一是减少了列重名引起的错误 4、条件语句中,在等效的情况下,是否使用“=”替代“”’; 高效SQL:SELECT * FROM EMP WHERE DEPTID =4 低效SQL:SELECT * FROM EMP WHERE DEPTID 3 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录;而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。 ;5、是否使用EXISTS替代IN、用NOT EXISTS替代NOT IN 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的???序和合并. (高效)SELECT * FROM EMP WHERE EMPID 0 AND EXISTS (SELECT 1 FROM DEPT WHERE DEPT.DEPTID = EMP.DEPTID AND LOC = MELB) (低效)SELECT * FROM EMP WHERE EMPID 0 AND DEPTID IN(SELECT DEPTID FROM DEPT WHERE LOC = MELB) ; ;6、 EXISTS中的select语句,使用select 1(固定值) from tab代替select * from tab“ 7、EXISTS代替DISTINCT 低效:SELECT DISTINCT D.DEPTID,D.DEPTNAME FROM DEPT D,EMPL E WHERE D.DEPTID = E.DEPTID 高效:SELECT D.DEPTID,D.DEPTNAME FROM DEPT D WHERE EXISTS (SELECT 1 FROM EMPL E WHERE E.DEPTID=D.DEPTID) 8、索引列作为条件时,是否避免列参与运算后,再进行比较操作; 使用了函数如UPPER、TO_CHAR等,使用了操作符如+、||等 低效:SELECT … FROM DEPT WHERE SAL * 12 25000; 高效:SELECT … FROM DEPT WHERE SAL 25000/12 ;9、两个表连接查询时,数据量小的表做为基础表(离FROM最远的表),三个及以上的表连接查询时,交叉表作为基础表; 例如: 表 TAB1 16,384条记录,表 TAB2 1条记录 选择TAB2作为基础表 (最好的方法) select count(*) from tab1,tab2 执行时间0.96秒; 选择TAB1作为基础表 (不佳的方法) select count(*) from tab2,tab1 执行时间26.09秒; 如果有3个以上的表连接查询, 那就需要选择交叉表(intersection t

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档