群讨论--函数索引 -位图索引 -预防死锁

来源:互联网 发布:百度网盘无法连接网络 编辑:程序博客网 时间:2024/05/29 14:43
1)函数索引 2)位图索引 3)预防死锁。
1)select * from T_SYS_LOG t where to_char(created_time,'yyyy-mm-dd')='2012-09-28'
假如在created_time上建立了索引,则上述语句一定用不到索引。
create index IX_CREATED_TIME_SYSLOG on T_SYS_LOG (CREATED_TIME);--这是原来的索引
create index IX_CREATED_TIME_SYSLOG on T_SYS_LOG (to_char(created_time,'yyyy-mm-dd')); --函数索引。

NULL走索引
create index t_ind on t(column_name,0); 

2)位图索引语法 create bitmap index bix_gendar_student on student(gendar);
select * from student s where s.gendar='MALE';--会高效利用上位图索引。普通b tree索引在这里不适用。
3)死锁问题是很多应用设计或实现不良造成的。例如:
update a set c=c1 where ...;
update b set c=c2 where ...;
update a set c=c3 where ...;
commit;
--这种语句出现在大并发的应用中,你就等死...锁吧。
改进后:
update a set c=c1 where ...;
update a set c=c3 where ...;
update b set c=c2 where ...;
commit;
死锁会导致程序挂起。这是dba首先应该去看alert.log.然后通过sql捕获死锁
v$lock
导致死锁的头号原因是外键未加索引,第二个原因是表上的位图索引遭到并发更新。
q1 如果更新了父表的主键(倘若遵循关系数据库的原则,即主键应当是不可变的,这种情况就很少见),由于外键上没有索引,所以子表会被锁住;
q2 如果删除了父表中的一行,整个子表也会被锁住(由于外键上没有索引)。
第一个原因是因为外键未加索引意味着关联的外键表无法利用索引,就需要做全表扫描,效率降低了,增加了资源占用时间;
第二个不用多说,并发更新相同的数据行通常都会发生死锁