in的效率问题

yzninan 2010-07-08 12:01:51
table1
----------------------
field1 field2 field3 ...
----------------------
主键为:field1 field2
数据量比较大:约300万

想从table1里查询记录,现已知道field1(m个)和field2(n个)的集合
field1→1,2,3,4,...,1000
field2→a,b,c,d,...,z

现在有两种方法

SELECT * FROM table1
WHERE 1=1
AND field1 IN ('1','2','3',...'1000')
AND field2 IN ('a','b','c',...'z')


用for循环执行m*n次,每次执行:
SELECT * FROM table1
WHERE 1=1
AND field1 = m
AND field2 = n
最后将每次执行的结果合并。

这两种做法效率上哪个好。或者有没有更好的方法。
感谢大家提供意见。
...全文
135 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzninan 2010-07-09
  • 打赏
  • 举报
回复
感谢大家热心的回复和帮助啊!!

最后还是把业务需求改了。所以就不这么查了啊。
谢谢1楼~5楼的朋友帮顶啊。
-----------------------------------------------------------------
iihero→这个方法很不错。提供了新思路。
新建表的操作一般不让我们做,表都是有人管理的。

lzf616→让我眼前一亮啊,应该说是在创建临时试图吧。
但是我的这个检索只是一次,临时试图的话,如果后面多次用这个结果效率会提高很多。
并且用with可能会改变执行计划。

先把改后的功能实现了吧。有时间一定要试试两位大虾提供的方案。

lzf616 2010-07-09
  • 打赏
  • 举报
回复

with t1 as (select level as lv1 from dual connect by level <1001), --这里是构造了1--1000的数据列
t2 as (select chr(lv) as lv2
from (select level as lv
from dual
connect by level < 123
minus
select level as lv from dual connect by level < 97)
) --这里是构造了 a--z的数据集合
select t.*
from table1 t
inner join t1 on t.field1 = t1.lv1
inner join t2 on t.field2 = t2.lv2 --通过关联 得出结果集

其实您的集合不一定是1--1000,和a--z,我只是按您举出个例子来构造SQL而已。
循环,是尽量不建议用的。除非你实在想不出好的集合方法。至于要建立什么索引,这个太明显了,自己研究,哈哈。——300W,数据量不大,应该无什么问题
PS:以上是个人娱乐而写,望各位大虾见谅。
iihero_ 2010-07-09
  • 打赏
  • 举报
回复
这两种方法显然都不是什么好方法。
不如建一张表tmp_f1(field1 varchar(4) not null primary key), tmp_f2(field2 char(1) primary key);
('1', ...., '1000')以及('a', ....'z')分别都insert进去

这表只需要建一次

SELECT t1.* FROM table1 t1, tmp_f1 f1, tmp_f2 f2 where t1.field1 = f1.field1 and t1.field2 = f2.field2

当然table1的field1和field2提前要建好索引。
AirportMan 2010-07-09
  • 打赏
  • 举报
回复
直接联表吧,俩个in的集合不就是俩张表。
Dave 2010-07-08
  • 打赏
  • 举报
回复

执行计划贴出来看看,感觉这2种写法效率都不高。
zjhiphop2006 2010-07-08
  • 打赏
  • 举报
回复
顶一下..
dingwood 2010-07-08
  • 打赏
  • 举报
回复
mark下。期待高人回复……
  • 打赏
  • 举报
回复
关注中

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧