一个关于sql效率的问题。

caweny 2004-10-15 02:46:56
我这边有一个sql:
select * from tab1 where id in (select id from tab2 where ???) or type = 'aa'
这个sql 执行的效率相当低。一般都要花1。5-2秒,tab1中的数据也不是很多,也才1w多点。tab2就更少了。

我试着把 or type = 'aa'去掉,速度很快,几十毫秒。
仅把id in (select id from tab2 where ???) 去掉,速度也快。
仅把select id from tab2 where ??? 改成把这条语句查出来的值直接写进去,也是很快。

但是放在一起就变的很慢了。
...全文
237 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
linuxbing 2004-10-18
  • 打赏
  • 举报
回复
学习
caweny 2004-10-18
  • 打赏
  • 举报
回复
我也知道该如何解决这个问题。
但我现在就是弄不明白,即使select id from tab2 where ??? 查询结果很少的时候,速度照样很慢。
我想知道为什么?
stevenllchen 2004-10-18
  • 打赏
  • 举报
回复
在sql文中查询条件中使用in或者or的方法,查询效率一般会降低很多,应尽量避免同时使用。
最好上文中的sql分成两次检索比较好。即先查select id from tab2 where ??? ,在把结果带入其中再查一次。
caweny 2004-10-18
  • 打赏
  • 举报
回复
to drugon(personal) :
你的解释有一定的道理,但还不是很有说服力。
按你的逻辑,如果嵌套的字句的查询结果少的话,那么速度应该也会快很多,譬如说只有一条,那即使是做了笛卡尔集,集合也不大,速度可能会慢一点,但应该慢不了多少。可现在不是慢一点,是慢了好多多。
mightyjiang 2004-10-15
  • 打赏
  • 举报
回复
type要建立索引,一般在insert之前删掉索引,之后建立索引
shengyh 2004-10-15
  • 打赏
  • 举报
回复
索引对查询来说很关键,可以让大数据量的表,如果加条件很快的得出结果。
但是建立索引又会影响insert的时间,因此,如何建索引是个很值得讨论的问题,尤其是在项目中,要具体问题具体分析。
drugon 2004-10-15
  • 打赏
  • 举报
回复
对于有大量数据的表,你做查询之前最好建立索引,它要快很多,还有要是没有必要就不要多表相关联查询,这样太大的数据量查询起来是很慢的。
drugon 2004-10-15
  • 打赏
  • 举报
回复
你的tab1中有1W多条记录,你又有用了in子句,在你的第二个子查询里面假设有100条符合条件的,那么对整个合乎条件的记录(不算后面的or条件),这时的数据集就是一个笛卡尔集,你想想,这个数据集是多少?大量的数据当然需要时间去处理了。因为每次执行这条语句的时候总是先得到里面那条语句的结果,然后才得到外面的结果。
你把or子句去掉,相当于去掉了一个数量集和没有去时候一样的处理,当然要快很多了。

而且如果我写成如下的时候
select * from tab1 where id in (1,2) or type = 'aa'
速度也不慢,也就是几十毫秒。

你这个时候就不是一个嵌套子查询了,它只在一个表中查询,所以记录集最多也只是在1W左右,但是
select * from tab1 where id in (select id from tab2 where ??? ) or type = 'aa'它就是一个嵌套的子查询 ,一般有多级嵌套的查询时,数据库往往都是从里向外执行,先得到里面的结果,然后得到外面的结果 ,所以这个子句的记录集应该比前面一个子句的数量级要大多了,至少它的记录集应在1W以上,这就是为什么不在一个数量集上。
caweny 2004-10-15
  • 打赏
  • 举报
回复
既然select * from tab1 where id in (1,2) or type = 'aa'的速度不慢,那么只要
select id from tab2 where ??? 不要太慢,那么
select * from tab1 where id in (select id from tab2 where ??? ) or type = 'aa'应该也慢不到那里去。可是却是有两个数量级上的变化。

谁能解释一下吗?
caweny 2004-10-15
  • 打赏
  • 举报
回复
好象都没把我的问题看清楚。
当我只使用select嵌套的时候,效率也是不低的。只有当嵌套和最后那个or 条件一起的时候才会变慢。

to:haobra521(正正)
用select * from tabl c1 ,tab2 c2 where c1.id = c2.id or c1.type='aa'
也就是联结话速度还要再慢一点点。
caweny 2004-10-15
  • 打赏
  • 举报
回复
id是索引。
albert2000 2004-10-15
  • 打赏
  • 举报
回复
两个select语句嵌套使用效率是很低的,假如每个表有100条数据,你这样嵌套使用就相当于100*100的数据量。所以操作大数据量的时候,最好不要这样用!
haobra521 2004-10-15
  • 打赏
  • 举报
回复
这样可不可以说个话啊

haobra521 2004-10-15
  • 打赏
  • 举报
回复
select * from tabl c1 ,tab2 c2 where c1.id = c2.id or c1.type='aa'
realaaaaa 2004-10-15
  • 打赏
  • 举报
回复
用外连接,嵌套效率不高
caweny 2004-10-15
  • 打赏
  • 举报
回复
而且如果我写成如下的时候
select * from tab1 where id in (1,2) or type = 'aa'
速度也不慢,也就是几十毫秒。
只有在in 跟嵌套都用的时候才变的特别慢。
haobra521 2004-10-15
  • 打赏
  • 举报
回复
什么是索引
caweny 2004-10-15
  • 打赏
  • 举报
回复
我最后的确采取了or分开写的方法。
但是分开写会使程序变的更复杂,而且万一涉及到排序就很不方便了。

没有更好的解决办法吗?
wingoffire 2004-10-15
  • 打赏
  • 举报
回复
既然是一个or的操作,不如就分开写,因为or操作会导致两次全表扫描,很不合算啊,另外你的id和type是否加了索引
xmbareheaded 2004-10-15
  • 打赏
  • 举报
回复
最好在语句里不要用in或exist这样效果会很低的,特别是在数据量很大的时候!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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