SQL1:
有索引而不能用,抛开insivisible和unusable 等情况,基本上可以确定是因为复合索引的两个字段定义都是NULL,因为索引不保存全是NULL的条目,为了保证结果的正确性,优化器不选择使用索引是正确的。
如果两个字段确实是可以为NULL,为了优化这个SQL,我们可以这样创建索引,两种方法:
1、在联合索引的两个字段后,再增加一个定义为NOT NULL的字段,形成3个字段的联合索引;
2、直接增加一个常量作为字段,形成3个字段的联合索引,如:
create index idx_name on CDMBAS.BAS_PAPPVACTINFO(PA_REQUNO,PA_ORDER,'x');
这个案例是一个真实的生产系统,实际的业务数据中,这两个字段都是NOT NULL的,这种情况我们还有两种做法来进行优化:
1、改写SQL,增加一个PA_REQUNO is not null的谓词条件(用另一个字段也可),即where 1=1 and PA_REQUNO is not null order by .....
2、alter table CDMBAS.BAS_PAPPVACTINFO modify (PA_REQUNO not null); 或改另一字段为not null,或者两个都改写not null,都可以。
SQL2:
这个用row_number()的分析函数来改写即可。不需要group by,表扫描只需要一次就完成了。
改写后的SQL就不写出来了,没有用过分析函数的朋友可以好好去学习一下,分析函数有很多功能,经常用到的就是去重功能,必须掌握。