哪位大佬帮忙协助分析一下regexp_substr和substr函数在11g和19c的表现问题:
DROP TABLE dba_man.REG_TEST;
DROP TABLE dba_man.REG_TEST2;
create table dba_man.reg_test(x int,y varchar2(20));
insert into dba_man.reg_test values (1,'1a2a3a4a');
insert into dba_man.reg_test values (2,'5a6a7a8a');
insert into dba_man.reg_test values (3,'9a10a11a12a');
insert into dba_man.reg_test values (4,'13a14a15a16a');
insert into dba_man.reg_test values (5,'17a18a19a20a');
alter table dba_man.reg_test add primary key (x);
create table dba_man.reg_test2(y varchar2(20));
insert into dba_man.reg_test2 values ('1');
insert into dba_man.reg_test2 values ('2');
insert into dba_man.reg_test2 values ('3');
insert into dba_man.reg_test2 values ('4');
insert into dba_man.reg_test2 values ('5');
insert into dba_man.reg_test2 values ('6');
insert into dba_man.reg_test2 values ('7');
insert into dba_man.reg_test2 values ('8');
insert into dba_man.reg_test2 values ('9');
insert into dba_man.reg_test2 values ('10');
insert into dba_man.reg_test2 values ('11');
insert into dba_man.reg_test2 values ('12');
insert into dba_man.reg_test2 values ('13');
insert into dba_man.reg_test2 values ('14');
insert into dba_man.reg_test2 values ('15');
insert into dba_man.reg_test2 values ('16');
insert into dba_man.reg_test2 values ('17');
insert into dba_man.reg_test2 values ('18');
insert into dba_man.reg_test2 values ('19');
insert into dba_man.reg_test2 values ('20');
alter table dba_man.reg_test2 add primary key (y);
test sql:
alter session set "_optimizer_mjc_enabled"=false;
select * from dba_man.reg_test where regexp_substr(y,'[0-9]+',1,rownum) in (select y from dba_man.reg_test2);
select substr(y,1,rownum),t1.* from dba_man.reg_test t1 where substr(y,1,rownum) in (select y from dba_man.reg_test2 T2);
11g:
| 4 | TABLE ACCESS FULL| REG_TEST | 5 | 125 | 3 (0)| 00:00:01 |
|* 5 | INDEX UNIQUE SCAN| SYS_C0088536 | 20 | 240 | 0 (0)| 00:00:01 |
19c:
| 4 | TABLE ACCESS FULL| REG_TEST | 5 | 125 | 3 (0)| 00:00:01 |
| 5 | INDEX FULL SCAN | SYS_C0017807 | 20 | 240 | 1 (0)| 00:00:01 |
问题一:
11g中:
regexp_substr和substr中含rownum时,索引走INDEX UNIQUE SCAN;
19c中:
regexp_substr和substr中含rownum时,索引走INDEX FULL SCAN ;
问题2:
substr中含rownum时,11g和19c出来的结果集不一致。11g的出来2条,感觉是对的;19c的出来5条,感觉是错的。
11g执行结果:
select substr(y,1,rownum),t1.* from dba_man.reg_test t1 where substr(y,1,rownum) in (select y from dba_man.reg_test2 T2);
SUBSTR(Y,1,ROWNUM) X Y
-------------------------------------------------------------------------------- ---------- --------------------
1 1 1a2a3a4a
13 4
19c执行结果:
select substr(y,1,rownum),t1.* from dba_man.reg_test t1 where substr(y,1,rownum) in (select y from dba_man.reg_test2 T2);
SUBSTR(Y,1,ROWNUM) X Y
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------- ------------------------------------------------------------
1 1 1a2a3a4a
13 4 13a14a15a16a
17a 5 17a18a19a20a
5a6a 2 5a6a7a8a
9a10a 3 9a10a11a12a