首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle -大表和大IN

Oracle -大表和大IN
EN

Database Administration用户
提问于 2019-05-22 20:08:05
回答 1查看 59关注 0票数 0

表学生大约有1000万条记录;ID是索引的。学生成绩有2000万个记录-- student_id被编入索引。我正在查询大约20,000名学生的身份证,其中包括学生和家长之间的联系:

代码语言:javascript
运行
复制
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分钟才能返回。有什么方法可以优化它吗?

谢谢!

EN

回答 1

Database Administration用户

回答已采纳

发布于 2019-05-22 20:21:27

数据来自外部源

IN子句限制为1000个值。不要用它来搜索。

解决办法:

  • 使用GTT (全局临时表)
  • 在GTT中添加“感兴趣的值”。
  • 针对GTT将SELECT语句修改为JOIN

示例

创建GTT

代码语言:javascript
运行
复制
create global temporary table students_gtt (
  student_id int primary key
);

将值插入GTT中

代码语言:javascript
运行
复制
insert into students_gtt
select level
from dual
connect by level <= 50000;

并将其加入SELECT语句中。

代码语言:javascript
运行
复制
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

Notes

  1. 首先,我怀疑很大一部分时间花在解析查询上。
    • 我使用一个22,974,957行表,并将其外部连接到一个93,501,293行表中,另外还加入了50,000行GTT。这些值以秒为单位返回。

  2. 最终,您将遇到解析器的“节点”限制。
  3. GTT方法不要求您“黑入SQL语句”。

来自另一个SQL语句的

数据?

只需将该SQL包含在SELECT语句中即可。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/238822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档