请教!!大表做连接的问题

[复制链接]
查看11 | 回复9 | 2007-4-25 04:02:08 | 显示全部楼层 |阅读模式
有两张表,表a和表b
其中表a是每个月一张表,每个月大约有3000-4000万条数据,有的月份可能会达到7000-8000万左右
表b现在大约有700万条数据,而且每个月还以200万左右的速度增加!

现在向把存在于表B的设备号的收入取出来,而收入存于表A中,所以要做一个连接才可以
现在有两种写法:
写法一: with temp_a as(select distinct b.equip_id

from b

where b.STATIS_MONTH = 201001)

Select /*+rule*/

a.EQUIP_ID,

sum(a.finally_account)
from a
Where a.DEPT_CODE = '0001'
AND exists(select * from temp_a d where d.equip_id = a.equip_id)
Group By

a.EQUIP_ID
写法二:
with temp_a as(select distinct b.equip_id

from b

where b.STATIS_MONTH = 201001)

Select /*+rule*/

a.EQUIP_ID,

sum(a.finally_account)
from a,temp_a d
Where a.DEPT_CODE = '0001'
AND d.equip_id = a.equip_id
Group By

a.EQUIP_ID
这两种写法那个相对较好呢,还是效果一样呢,针对这样的情况有没有更好的解决方法。

请赐教,谢谢了!
[ 本帖最后由 zmyshr 于 2010-5-28 15:14 编辑 ]
回复

使用道具 举报

千问 | 2007-4-25 04:02:08 | 显示全部楼层
看执行计划!~~
回复

使用道具 举报

千问 | 2007-4-25 04:02:08 | 显示全部楼层
原帖由 dingjun123 于 2010-5-28 15:16 发表
看执行计划!~~


用pl sql dev看了一下,第一种写法走了表a一条DEPT_CODE列上索引,第二中写法走了表A的DEPT_CODE和EQUIP_ID列上的索引,由于表B没有索引所以都是table acess full,但是看不到cost,bytes这些值,不敢肯定那个比较好。
回复

使用道具 举报

千问 | 2007-4-25 04:02:08 | 显示全部楼层
你不走CBO当然没有COST了!~
还是走CBO吧,把表和索引的统计信息收集下
你这个应该是分区表吧??
回复

使用道具 举报

千问 | 2007-4-25 04:02:08 | 显示全部楼层
个人感觉第二个好
回复

使用道具 举报

千问 | 2007-4-25 04:02:08 | 显示全部楼层
原帖由 dingjun123 于 2010-5-28 15:29 发表
你不走CBO当然没有COST了!~
还是走CBO吧,把表和索引的统计信息收集下
你这个应该是分区表吧??


不是分区表,那个大表是每个月一张表,是底层切分CREATE出来的
这是第一种写法的查询计划:

costcard
bytes
SELECT STATEMENT, GOAL = HINT: ALL_ROWS
26646
2676917
203445692

SORT GROUP BY
26646
2676917
203445692

HASH JOIN
9734
2676917
203445692

SORT UNIQUE

TABLE ACCESS FULL
ODS_EQUIP_ID_QINQING_M
7354
44391
843429

TABLE ACCESS BY INDEX ROWID
DIV_INCOME_201004
2
3172454
180829878

INDEX RANGE SCAN
INDEX_A_DEPT_CODE_1004_08
1
2797





第二种:

SELECT STATEMENT, GOAL = HINT: ALL_ROWS
44824
3849
150111

SORT GROUP BY
44824
3849
150111

VIEW
SYS
44824
2676917
104399763

SORT UNIQUE
44824
2676917
222184111

HASH JOIN
9771
2676917
222184111

TABLE ACCESS FULL
ODS_EQUIP_ID_QINQING_M
7354
44391
843429

TABLE ACCESS BY INDEX ROWID
DIV_INCOME_201004
2
3172454
203037056

INDEX RANGE SCAN
INDEX_A_DEPT_CODE_1004_08
1
2797



我感觉看查询计划还是第一种稍好些,不知大家的意见??
[ 本帖最后由 zmyshr 于 2010-5-28 15:56 编辑 ]
回复

使用道具 举报

千问 | 2007-4-25 04:02:08 | 显示全部楼层
就cost来看第一种好,要不到sqlplus中看看其他的参数怎么样,比如一致性读
回复

使用道具 举报

千问 | 2007-4-25 04:02:08 | 显示全部楼层
原帖由 dingjun123 于 2010-5-28 15:57 发表
就cost来看第一种好,要不到sqlplus中看看其他的参数怎么样,比如一致性读


通过查询计划看一个SQL性能的高低,主要看那几个指标呢,请前辈赐教一下!
回复

使用道具 举报

千问 | 2007-4-25 04:02:08 | 显示全部楼层
主要看cost,然后就是cardinality,consistent之类的,深入的还要看parse,execute等。
简单的看看cost就可以了,嘿嘿,参考下oracle优化文档,上面比较全面
回复

使用道具 举报

千问 | 2007-4-25 04:02:08 | 显示全部楼层
原帖由 zhangfengh 于 2010-5-28 16:06 发表
为什么加hint?有什么根据说rule就一定好?

是这样,如果不加HINTS,表A有几个月不走索引,直接全表扫描,我也不清楚是怎么回事,这个表是其他人的表,我们只有查询的权限,可能是他建表的时候出现的问题。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行