sql – Oracle where子句的性能不佳

我有以下Oracle表:

create table my_table(
   start int,
   end int
);

insert into my_table values(1, 3);
insert into my_table values(5, 7);
insert into my_table values(11, 200);
insert into my_table values(311, 5000);
insert into my_table values(60004, 60024);
insert into my_table values(123213, 12312312);

这个表有1M行并存储数字范围(‘start’,’end’),所有数字都是唯一的,它没有重复的范围,任何数字只能在这个表的一个范围内,我有以下查询通过一个变量my_number用于标识范围的“开始”.

 execute immediate 
    'select start from my_table where :1 between start and end' using my_number

我在两个字段上构建了组合索引.问题是当my_number很小时,查询的性能很好,但是当my_number增加时,查询时间会不断增加.如果my_number更大,则需要花费相当长的时间才能完成.有人有办法改进这个查询吗?方式可以包括重新设计my_table.谢谢.

最佳答案 如果您将架构更改为:

create table my_table(
   start int,
   range_size int
);

insert into my_table values(1, 2);
insert into my_table values(5, 2);
insert into my_table values(11, 189);
insert into my_table values(311, 4689);
insert into my_table values(60004, 20);
insert into my_table values(123213, 12300001);

然后,您只能在开始列上编制索引.

execute immediate 
    'select start from (select start, range_size from my_table where start < :1 order by start asc limit 1) tmp where :1 < start+range_size' using my_number

这可能会有一些性能提升.

点赞