[原创]SQL的IN中有很多值,如何处理能提高效率?
上一篇 /
下一篇 2008-03-31 19:30:57
/ 个人分类:Oracle
近日碰到一个棘手的问题,从外部得到了一组ID数据,要跟Oracle中的某个表做比对,从Oracle中取出ID一样的数据。举个例子,pub有版主有会员,版主是会员的子集,版主名单存在Oracle里面,但会员名单没存在里面。假设pub在搞抽奖活动,一小时一次,中奖的会员名单通过中奖系统传给Oracle。我现在想把刚才中奖的会员中是版主的名单列出来,该怎么做。
实际环境中,通过外部获得的数据数量级为K,Oracle的这个表数量级为几十K到上百K,比对效率成为一个关键因素。我能想到的方法就是构造多条SQL语句,把这些ID作为IN的列表值传进去(IN后的列表项不能超过1000个,故可能会需要多个sql)。
带着问题咨询了yangtingkun ,得到的答复是效率不会太高也不会太低,Oracle可能会做全表扫描,但效率比你一个一个去比对肯定要快了。实际执行了一下,IN里面传了300个参数,得到执行计划如下(做的是 INDEX RANGE SCAN):
执行计划
----------------------------------------------------------
Plan hash value: 1656459801
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 284 | 1136 | 1 (0)| 00:00:01 |
| 1 | INLIST ITERATOR | | | | | |
|* 2 | INDEX RANGE SCAN| XXXXXX| 284 | 1136 | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------
拼多个sql语句是麻烦一点,不过这样做效率上没啥问题。想想也是,总比我将数据插入表,通过表关联去做要方便一些,因为建表的话我毕竟还需要对表里的数据进行维护。
“哦,这样的话,你建一个临时表吧!”
“global temporary table?”
“嗯,这表就是专门用来解决这样的问题的!临时数据只管往里面插,可通过on submit关键字设置为会话有效或者事务有效,各会话间互相看不到数据,不会互相影响。”
哈哈,原来问题这么简单啊!省去了数据维护的麻烦,得到了表关联带来的高效数据处理,唯一会影响到效率的问题就是往临时表里插数据了,一条一条显然很慢了,考虑用存储过程来实现,呵呵。
最后,感谢老杨
相关阅读:
- 一步一步学DataGuard(16)逻辑standby之高级管理1 (junsansi, 2008-3-27)
- Oracle 内部如何存储 Number 类型的数值 (oracle_kai, 2008-3-27)
- 集成 Oracle 业务智能企业增强版和 SOA (idba, 2008-3-28)
- Oracle Warehouse Builder 11g 入门之使用平面文件事务数据 (idba, 2008-3-28)
- Oracle Warehouse Builder 11g 入门之设计关系目标仓库 (idba, 2008-3-28)
- 注册开发好的OAF页面到Application (OracleERPR12, 2008-3-28)
- 一步一步学DataGuard(17)逻辑standby之高级管理2 (junsansi, 2008-3-28)
- 在 oracle 10g 中訪問 SQL Server (OracleERPR12, 2008-3-28)
- 行迁移检测及解决一例 (oracle_kai, 2008-3-31)
- 一步一步学DataGuard(18)逻辑standby之高级管理3 (junsansi, 2008-3-31)
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG:
global
oracle
temporary