SQL效率/优化/子查询

有个功能,目前的SQL如下:selectcount(*)fromtab1wherecol1notin(selectcol1fromtab2);这个效率太慢了。有什么方法能... 有个功能,目前的SQL如下:select count(*) from tab1 where col1 not in (select col1 from tab2);
这个效率太慢了。有什么方法能实现这个功能,效率能高点。执行速度能快点。一个表的记录能有300多万。执行太慢了。。 账号里没多少分了。只有这么多。希望高手能帮帮忙。
这个查询功能 还有个同样的表要用到,记录是1800多万。exist效率不行。
展开
 我来答
己闻楣Sx
2011-07-12 · TA获得超过1936个赞
知道大有可为答主
回答量:1057
采纳率:93%
帮助的人:914万
展开全部
1、用表连接替代子查询
select count(*) from tab1 t1, tab2 t2 where t1.col1=t2.col2
2、建立索引
create index I_tab1_col1 on tab1( col1 )
create index I_tab2_col1 on tab2( col1 )
更多追问追答
追问
说详细点。这么查根本不行。索引我早就建了。
追答
抱歉,逻辑看反了,采用楼上的应该可以,如效率仍不满意,试试下面这个:
select count(*) - ( select count(*) from tab1 t1, tab2 t2 where t1.col1=t2.col1 ) from tab1
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
unlorzzop
2011-07-14 · TA获得超过713个赞
知道小有建树答主
回答量:514
采纳率:0%
帮助的人:385万
展开全部
SQL本身没有问题,数据量也没有太夸张,全是内连接也不构成问题,真正影响执行性能的是IN和NOT IN,特别是最后的NOT IN,随着数据量增加,执行效率直线下降。优化方法就是少用IN和NOT IN。
追问
等于没说。你说的我 都知道
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
flyingFish211
2011-07-12 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.5万
采纳率:50%
帮助的人:1.1亿
展开全部
SELECT COUNT(1)
FROM tab1
WHERE NOT EXISTS (SELECT col1 from tab2 and col1 = tab1.col1)

col1上再建立索引吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
flyuser0428
2011-07-14
知道答主
回答量:27
采纳率:0%
帮助的人:15.9万
展开全部
你很明显,用NOT IN这种,速度慢的.

你一定要用到索引,才会速度快.

如你的语句,你可以这样写:
select count(*) from tab1 where exists (select 1 from table2 where table2.col1 = tab1.col1);

当然,前提是,tab2,上有COL1这个字段的索引.

请采纳!
追问
试过。效率还是不行。
追答
看看执行计划?发出来.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
duomo6161
2011-07-19 · TA获得超过151个赞
知道答主
回答量:117
采纳率:0%
帮助的人:121万
展开全部
你这个表中是分区表嘛,如果不是的话效率会很低,如果是分区表的话建立上分区索引,这样效率会提高不少。具体的分区表如何建立搜索下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式