我现在在生产环境上写一些脚本,但是碰到一个update问题语句很简单,涉及到一个索引,性能影响很大。
数据库版本是oracle10g这是两个不同的表,但是索引数量一样,10几个,数据量也一样,20多万。A,B表id是主键,flag上是一个normal index,包含的值有null,1,2,3执行相同逻辑的语句,大概update 2万条记录,A表80多秒,B表只要3秒多。
update A set a='1' where id=? and flag is null; update B set b='1' where id=? and flag is null;
当执行 条件发生变化时,都变成1,就都差不多。
为什么执行条件为NULL的时候,会差这么多呢? update A set a='1' where id=? and flag =‘1’; update B set b='1' where id=? and flag =‘1’;
A 表
id ,主键
a varchar
flag varchar
B表
id,主键
b varchar
flag varvhar
数据库版本是oracle10g这是两个不同的表,但是索引数量一样,10几个,数据量也一样,20多万。A,B表id是主键,flag上是一个normal index,包含的值有null,1,2,3执行相同逻辑的语句,大概update 2万条记录,A表80多秒,B表只要3秒多。
update A set a='1' where id=? and flag is null; update B set b='1' where id=? and flag is null;
当执行 条件发生变化时,都变成1,就都差不多。
为什么执行条件为NULL的时候,会差这么多呢? update A set a='1' where id=? and flag =‘1’; update B set b='1' where id=? and flag =‘1’;
A 表
id ,主键
a varchar
flag varchar
B表
id,主键
b varchar
flag varvhar
你是在生产环境,也有可能是你更新A表时,有客户正在使用A表,锁表了就等待了一段时间