in和or的区别
现在程序用的是in
in里面的项目900多项
执行一次sql文需要20多秒
第一问 改成or会不会变快?
第二问 in好像是不能超过1000项?or是否有限制?
第三问 in的时候索引不起作用,or的时候是否起作用?
问题点数:50、回复次数:17Top
1 楼cenlmmx(学海无涯苦作舟)回复于 2006-01-24 10:32:31 得分 2
in最后还是要被转成or语句,如果你的in项目太多,建议你把这900项先放到一个临时表(逻辑意义上的临时表),把两个表做连接.Top
2 楼ljgeneral317(地狱火)回复于 2006-01-24 11:27:57 得分 2
对 in和or效率上没多少差别 不过我觉得900 个应该不会那么慢 你可以用楼主的建议试一下
select * from table1 where item1 in ( select name from temp_table );
应该说很快的速度 这样的查询Top
3 楼ragweed_wg(冷月青州)回复于 2006-01-24 15:25:40 得分 2
in 能不用就不要去用,关联的话,最好也使用主键、索引为关联字段。
select *
from table1,temp_table
where table1.item1 = temp_table.nameTop
4 楼genphone_ru(哎,什么都要学,真累)回复于 2006-01-24 16:01:03 得分 2
把你的表结构和需要实现的算法贴出来Top
5 楼ynli2002(阿男)回复于 2006-01-25 15:08:56 得分 0
把900多个项目登陆到临时表,就不用费时间吗?
感觉把900多个项目做insert操作,再加上表连接检索。加起来比 in(900多个项目)更费时间呢?Top
6 楼ynli2002(阿男)回复于 2006-01-25 19:16:10 得分 0
自己顶Top
7 楼cenlmmx(学海无涯苦作舟)回复于 2006-01-25 23:52:46 得分 2
我是说你不要用in方式查询,而是做表连接最快,绝对是比in(900多个项目)更省时间.
先把900个用sqlloader插入一个临时用的表,要得了多久呢.Top
8 楼swimming8243(swimming)回复于 2006-01-26 09:24:05 得分 2
楼上的真的可行吗?
插900条记录到临时表要n久,再查询估计时间更久
建议楼主把各种方法试试吧,可能楼上的效率是最高的Top
9 楼ynli2002(阿男)回复于 2006-01-26 10:47:05 得分 0
to cenlmmx(学海无涯苦作舟)
首先这900多个项目是存在于内存中,不是文件,sqlloader不能用
其次900多个项目就意味着执行 900多次的insert操作 加上 建立临时表的时间 加上 连接查询的时间真的会比 in(900多个项目)花费时间短吗?总觉得不大可能呢
如
//建立临时表
create Temp Table tableTemp;
for(int i=0; i<900; i++) {
insert tableTemp values (项目值i)
}
select ** from a, tableTemp where a.key = tableTemp.key
//in方式查询
select ** from a where key in(项目值1,项目值2.......项目值900)
上面两个哪一个更快?Top
10 楼ragweed_wg(冷月青州)回复于 2006-01-27 08:42:46 得分 2
select ** from a, tableTemp where a.key = tableTemp.key
方式效率高,Temp 表的数据量越大越明显,(为提高效率,将Temp表中的key设置为主键或索引)。
不得不用in的情况下,in后面sql中加上order by,效果“大多数”(不是绝对的)情况下也会提高一些。Top
11 楼ynli2002(阿男)回复于 2006-01-27 11:57:11 得分 0
怎么都不看看问题
我当然知道select ** from a, tableTemp where a.key = tableTemp.key
方式效率高了
那不是得把数据先做insert操作麻
insert就不算时间啊
清仔细看看问题再回答Top
12 楼kingofworl(良辰美景虚度)回复于 2006-01-31 02:19:04 得分 0
请问诸位 select ** from 两个* 是什么用法呀,我本以为笔误,但发现好几个人都这么用,好奇Top
13 楼INTEL8086(向左看,向右看)回复于 2006-02-03 15:31:56 得分 0
in 的效率比较低,向提高效率用exists替换Top
14 楼epbon(没有)回复于 2006-02-14 15:19:44 得分 2
To:kingofworl(良辰美景虚度)
好像没有两个*用法,大概是代码Copy造成的:)Top
15 楼mingxuan3000(铭轩)回复于 2006-02-14 16:05:26 得分 10
in不能超过1000项Top
16 楼boydgmx(授人以鱼不如授人以渔(baidu&google))回复于 2006-02-14 16:12:22 得分 24
如果你的in里面项不会超过1000的话,就用in吧。
那个 “select ** ”显然是有人急着回答问题,copy别人的Top
17 楼ynli2002(阿男)回复于 2006-02-20 10:38:15 得分 0
没有一个好答案
散分Top




