- 层次查询
SELECT employee_id, last_name, manager_id,salary
FROM employees WHERE salary>10000
START WITH employee_id='F00001'
CONNECT BY PRIOR employee_id = manager_id;
先找到employee_id为F00001这条记录,接着找下一条记录,查找下一条记录条件为manager_id为F00001,然后根据第二条记录的employer_id的值做为manager_id找第三条记录,以此类推递归查询,最后找出salary大于10000的记录
-
Oracle 事务
两种基本模式的锁:排它锁,共享锁。当数据对象被加上排它锁时,其他的事物不能对他进行读取和修改,当加上共享锁时候,其它事物不能对他进行修改,但是可以进行读取。
Oracle中主要锁为DML锁,DML锁包括TM锁表级锁,TX锁行级锁。当Oracle执行DML语句时,系统自动在所需要的表上申请TM模式的锁。当获得TM锁后,在自动申请TX模式的锁,并将实际锁定的数据行的锁标志为进行置位。这样在事务加锁前检查TX锁相容性时就不用在逐行进行检查锁标志,而只检查TM锁的相容性即可。
TM锁是在表添加的锁,当一个事务执行insert,update,merge,delete语句,或使用select for update 语句进行查询,或执行lock table 语句时,事务获得操作表的TM锁。
Oracle数据库中TM锁分为行级共享锁、行级排它锁、共享锁、共享行级排它锁和排他锁5中模式。
LOCK TABLE 表名 IN SHARE MODE;
LOCK TABLE 表名 IN EXCLUSIVE MODE NOWAIT;
LOCK TABLE 表名 IN ROW SHARE MODE;
LOCK TABLE 表名 IN ROW EXCLUSIVE MODE;
LOCK TABLE 表名 IN SHARE ROW EXCLUSIVE MODE;
当执行COMMIT 或 ROLLBACK 语句时,使用LOCK TABLE语句对表加的锁将自动解除。 -
CHAR和VARCHAR2
CHAR的长度时固定,VARCHAR2长度时可以变化的。VARCHAR2是按实际长度存储。
因为CHAR长度固定,省去了判断实际长度在去寻址的操作,效率比VARCHAR2的效率稍高。
如果一个一个字段经常被修改,而且每次被修改的数据长度不同,会引起行迁移现象,造成多余I/O,这是数据库设计中尽量避免的,在这种情况下CHAR代替VARCHAR2会好。
CHAR使用场景:数据长度基本一致,且长度不易过长。数据更新频繁查询较少,可防止行迁移发生的概率,同时尽可能少见索引。DDL操作非常少,CHAR类型增加长度的开销是很大的。
VARCHAR2使用场景:该字段数据长度不规则,差异大。数据更新较少,查询操作频繁,适量建立索引。DDL操作少,VARCHAR2类型增加长度也会加大行迁移发生概率。