楼主: alan_yang

探讨一下这个sql的执行!

[复制链接]
论坛徽章:
0
21#
发表于 2001-10-10 14:07 | 只看该作者

MINUS IS BETTER

单纯为满足以上的要求,用MINUS会快很多! EXISTS也很快,但取反的NOT EXISTS使其速度大大降低了, NOT IN 和NOT EXISTS 都要激活条件检索还要取反,耗时巨大,而MINUS则是执行两个简单查询子句,对结果进行相减处理。我刚刚进行过类似的处理。两个表数据量各为70万件,MINUS大约需要8分钟,而其他方法则要花几个小时。

使用道具 举报

回复
论坛徽章:
41
ITPUB元老
日期:2005-02-28 12:57:002011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
22#
 楼主| 发表于 2001-10-10 14:20 | 只看该作者

      问题是如果不是单纯的count,还要sum其他列呢?
   而且table A and B  的结构并不相同!

   所以,还是kezizi 的办法好!
   

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
23#
发表于 2001-10-10 14:21 | 只看该作者

Re: MINUS IS BETTER

最初由 huaz 发布
[B] EXISTS也很快,但取反的NOT EXISTS使其速度大大降低了, NOT IN 和NOT EXISTS 都要激活条件检索还要取反,耗时巨大[/B]

EXISTS很快,怎么会 NOT EXISTS会很慢?

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
24#
发表于 2001-10-10 15:07 | 只看该作者
1。单纯的取反不花时间。NOT EXISTS 比EXISTS 慢是因为EXISTS操作在发现第一条符合条件的记录时就返回,NOT EXSITS 要把所有记录比较才得出结论。读取的数据多。担在上例中不明显。(SUB QUERY 只有一个PAGE〕可以做个试验。让B TABLE只含一条记录,这时NOT EXISTS 和EXISTS 应是一样的。否则ORACLE就错了 。 或者有以把EXISTS的B记录放在最后,有同样试验效果。
2。IN和EXISTS 的区别是内部算法不同。我前面说过。
3。MINUS操作我没研究过。我大概想了一下,其内部操作确实是有很多手段可以优化。我的知识老了,得补课了。

但有几点不可怀疑,这也是我为什么自信上面我的SQL 在同样条件下不会慢很多(就算慢也是同一数量级的,不会是N倍,LOG(N〕倍,或N平方倍,N和页面数有关〕。因为:
1。至少2个TABLE的FULL SCAN 不可少。(没有INDEX〕
2。数据库内部的JOIN算法就那么4种,HASH法对两个大TABLE的JOIN是较有效的,可惜ORACLE做得不是最好。
3。MINUS操作不应该比JOIN快两倍以上,否则 所有的 JOIN 操作就在ORACLE内部应被写成两个MINUS: TABLE A JOIN TABLE B =TABLE A - (TABLE A-TABLE B〕,假设只需要一个TABLE中的数据返回。这么大的事我应该知道。如果差两被以上,应该是OPTIMIZER的错
4。我的SQL有两个SCAN,一个JOIN (很小的〕不会慢,只有GROUP BY 和 DISTINCT 我不是很有信心是不是最好的,应为有牵涉到TEMP TABLESPACE 操作,麻烦大了。如果GROUP BY 和DISTINCT 很慢,可以干脆不要。

使用道具 举报

回复
论坛徽章:
0
25#
发表于 2001-10-10 16:19 | 只看该作者

使用反结合。。。

替代not in 的最常用办法,not exist在数据量小的时候可以,太大了效果也不好。

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
26#
发表于 2001-10-10 17:59 | 只看该作者
某表


select count(*) from TABLE_人口 where not exists ( select 1 from TABLE_人口 where 性别='男')



select count(*) from TABLE_人口 where exists ( select 1 from TABLE_人口 where 性别='男')

的查询速度 是不一样的?(男女均分人口)呵呵,我认为not exists子查询也是碰到了第一个结果就返回,不过 就是多了一个 not操作,条件值变反了

比如表里:

性别




.
.
.
...


not exists ( select 1 from TABLE_人口 where 性别='男')
当扫描到第三条纪录时,子查询返回,整个表达时条件值为 假

exists ( select 1 from TABLE_人口 where 性别='男')
也是扫描到第三条纪录时,子查询返回,整个表达时条件值为 真
而已

当然查询结果是完全两样的(前者为0,后者为total)

以上只是就exists 和 not exists 而言,跟贴子 的主题扯远了,sorry啦

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
27#
发表于 2001-10-11 05:21 | 只看该作者
You are comparing the situation between Exists=True and Not Exists=False
I was talking about the difference between Exists=True and Not Exists=True.

Different topic

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
28#
发表于 2001-10-11 13:35 | 只看该作者
Different Condition,Diffenrent topic -->Different Result

how can we draw the conclusions:
"
NOT EXISTS 比EXISTS 慢是因为EXISTS操作在发现第一条符合条件的记录时就返回,NOT EXSITS 要把所有记录比较才得出结论。
"

"
EXISTS也很快,但取反的NOT EXISTS使其速度大大降低了
"

查询速度的快慢  跟具体 子查询有关,怎能 说  exists 就比 not exists快?

not exists ( select 1 from TABLE_人口 where 性别='变态')

当然很慢。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
29#
发表于 2001-10-11 13:57 | 只看该作者
你把我的意思搞混了,我说的和你说的是一个事。
我的意思是:
“EXISTS也很快,但取反的NOT EXISTS使其速度大大降低了 “这句话不对。
如果有人作试验出现EXISTS 比NOT EXISTS快的话,只因为是数据的差别,不是EXISTS 和NOT EXISTS的差别。

使用道具 举报

回复
论坛徽章:
3
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
30#
发表于 2001-10-11 15:10 | 只看该作者
sorry,

i am really confused ,xixi

原来我们的意见是一致的,哈

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表