表学生大约有1000万条记录;ID是索引的。学生成绩有2000万个记录-- student_id被编入索引。我正在查询大约20,000名学生的身份证,其中包括学生和家长之间的联系:
select * from students s left join grades g on s.id=g.student_id
where (s.id IN (s1, s2... s1000)
or (s.id IN (s1001, s1002... s2000)
or (s.id IN (s.2001, s2002...s3000)
//until s20000)
我需要将INs分成多个批次,因为IN只能得到1000个或更少的值。
查询大约需要5分钟才能返回。有什么方法可以优化它吗?
谢谢!
发布于 2019-05-22 20:21:27
IN
子句限制为1000个值。不要用它来搜索。
解决办法:
SELECT
语句修改为JOIN
。创建GTT
create global temporary table students_gtt (
student_id int primary key
);
将值插入GTT中
insert into students_gtt
select level
from dual
connect by level <= 50000;
并将其加入SELECT语句中。
select
*
from
students s
left join grades g on s.id = g.student_id
join students_gtt g on s.student_id = g.student_id
来自另一个SQL语句的
只需将该SQL包含在SELECT
语句中即可。
https://dba.stackexchange.com/questions/238822
复制相似问题