ITPUB??ì3
ITPUB论坛 » Oracle数据库管理 » 两个大表的查询SQL 调优

标题: 两个大表的查询SQL 调优
离线 yanliu73
中级会员



精华贴数 0
个人空间 0
技术积分 848 (2102)
社区积分 4 (15926)
注册日期 2002-5-29
论坛徽章:0
      
      

发表于 2008-5-6 10:30 
两个大表的查询SQL 调优

大虾们帮忙看看下面的SQL怎么调优:
SELECT /*+ index(s TRADE_SUMMARY_STATUS_KEY) */
       COUNT (*)
  FROM trade t, trade_summary_status s
WHERE t.trade_no = s.trade_no
   AND s.trade_summary_type_cd = 'SETSTAT'
   AND s.trade_summary_status_cd IN ('FP', 'PSF')
   AND t.trade_date < SYSDATE - 30
   AND t.trade_version_status_cd = 'A';

执行计划:
Operation        Object Name        Rows        Bytes        Cost        Object Node        In/Out        PStart        PStop

SELECT STATEMENT Optimizer Mode=ALL_ROWS                1                   50 M                                                     
  SORT AGGREGATE                1          58                                                                
    MAT_VIEW ACCESS BY INDEX ROWID        TRM_REPOSITORY.TRADE        1          23          1                                                       
      NESTED LOOPS                5 M        321 M        50 M                                                     
        MAT_VIEW ACCESS BY INDEX ROWID        LCM_REPOSITORY.TRADE_SUMMARY_STATUS        5 M        194 M        45 M                                                     
          INDEX FULL SCAN        LCM_REPOSITORY.TRADE_SUMMARY_STATUS_KEY        136 M                 5433353                                                       
        INDEX RANGE SCAN        TRM_REPOSITORY.TRADE_TRADE_NO_IDX        1  

1/环境ORACLE10G
2/两个表都是上亿条记录的大表;
3/ LCM_REPOSITORY.TRADE_SUMMARY_STATUS_KEY 是 UNIQUE INDEX  ON TRADE_SUMMARY_STATUS(TRADE_NO, TRADE_SUMMARY_TYPE_CD);
TRM_REPOSITORY.TRADE_TRADE_NO_IDX        1 是 INDEX ON TRADE
(TRADE_NO, TRADE_VERSION_NO)

跑了8小时也没出来, 大家帮忙看看, 在线等, 谢谢拉.
                 1


__________________
i love oracle
只看该作者    顶部
离线 rollingpig
版主


精华贴数 4
个人空间 0
技术积分 25739 (32)
社区积分 1446 (687)
注册日期 2001-10-18
论坛徽章:53
现任管理团队成员2006年度最佳技术回答Heart of PUBITPUB北京九华山庄2008年会纪念徽章蓝锆石海蓝宝石
会员2007贡献徽章2008北京奥运纪念徽章:沙滩排球2008年新春纪念徽章每日论坛发贴之星  

发表于 2008-5-6 10:39 
alter session set workarea_size_policy=manual;
alter session set hash_area_size=1024000000;
SELECT /*+use_hash(t s) */
       COUNT (*)
  FROM trade t, trade_summary_status s
WHERE t.trade_no = s.trade_no
   AND s.trade_summary_type_cd = 'SETSTAT'
   AND s.trade_summary_status_cd IN ('FP', 'PSF')
   AND t.trade_date < SYSDATE - 30
   AND t.trade_version_status_cd = 'A';


__________________
提问的智慧Oracle版
0。尝试在google,论坛,metalink,online document里搜索。
1。写清楚你的执行log,报错信息,写清楚DB version , OS
2。Instance 方面的问题,请贴出alertlog
3。network的问题,贴出server的listener.ora , sqlnet.ora 并运行lsnrctl service, 贴出client的tnsnames.ora , sqlnet.ora ,并运行tnsping
4。DB总体性能问题,请于peak time做statspack,并上传statspack report。同时附上CPU/MEM配置,以及CPU IDLE/free menory的情况
5。SQL性能问题,列出当前SQL,以及PLAN。同时应提供表结构,index情况,Table的record数。CBO/RBO,table是否analyze等信息。
6。确保你的问题是Oracle相关。
提问的智慧 for Oracle[展开版]
只看该作者    顶部
离线 anlinew


精华贴数 1
个人空间 0
技术积分 6111 (201)
社区积分 130 (2778)
注册日期 2002-11-4
论坛徽章:17
现任管理团队成员ITPUB元老ITPUB北京九华山庄2008年会纪念徽章会员2007贡献徽章授权会员ITPUB新首页上线纪念徽章
      

发表于 2008-5-6 10:45 
30天的数据不是很多的话
t.trade_date 的索引或许有些用


只看该作者    顶部
离线 lsc800426
中级会员



精华贴数 0
个人空间 0
技术积分 1608 (986)
社区积分 12 (9382)
注册日期 2007-1-12
论坛徽章:2
2008年新春纪念徽章ITPUB新首页上线纪念徽章    
      

发表于 2008-5-6 10:47 


QUOTE:
原帖由 anlinew 于 2008-5-6 10:45 发表
30天的数据不是很多的话
t.trade_date 的索引或许有些用

那是不是如果每天的数据量都很大的话,做分区会比较好呢?


__________________
坚持就是胜利!
只看该作者    顶部
离线 kelsoncong
太极虫


来自 苏州
精华贴数 0
个人空间 140
技术积分 1315 (1238)
社区积分 20 (7194)
注册日期 2006-9-2
论坛徽章:4
2008年新春纪念徽章行业板块每日发贴之星数据库板块每日发贴之星每日论坛发贴之星  
      

发表于 2008-5-6 10:47 
为什么oracle会选择用nested loop呢?


__________________
太极者,无极而生,阴阳之母也。动之则分,静之则合。无过不及,随屈就伸。人刚我柔谓之走;我顺人背谓之粘。运急则急应,动缓则缓随。虽变化万端而理唯一贯。由着熟而渐悟懂劲,由懂劲而阶及神明。然非用力之久,不能豁然贯通焉。虚领顶劲,气沉丹田;不偏不倚,忽隐忽现;左重则左虚,右重则右杳,仰之则弥高,俯之则弥深;进之则愈长,退之则愈促。人不知我,我独知人……立如秤准,活似车轮;偏沉则随,双重则滞……须知阴阳;粘即是走,走即是粘;阳不离阴,阴不离阳;阴阳相济方为懂劲。懂劲后,愈练愈精,默识揣摩,渐至从心所欲……
只看该作者    顶部
离线 anlinew


精华贴数 1
个人空间 0
技术积分 6111 (201)
社区积分 130 (2778)
注册日期 2002-11-4
论坛徽章:17
现任管理团队成员ITPUB元老ITPUB北京九华山庄2008年会纪念徽章会员2007贡献徽章授权会员ITPUB新首页上线纪念徽章
      

发表于 2008-5-6 10:52 


QUOTE:
原帖由 lsc800426 于 2008-5-6 10:47 发表


那是不是如果每天的数据量都很大的话,做分区会比较好呢?

我看错了
这业务是查30天前的,汗


只看该作者    顶部
在线/呼叫 star_guan2008
初级会员


来自 北京
精华贴数 0
个人空间 1850
技术积分 956 (1833)
社区积分 32 (5779)
注册日期 2007-8-8
论坛徽章:1
生肖徽章2007版:鼠     
      

发表于 2008-5-6 10:56 


QUOTE:
原帖由 rollingpig 于 2008-5-6 10:39 发表
alter session set workarea_size_policy=manual;
alter session set hash_area_size=1024000000;
SELECT /*+use_hash(t s) */
       COUNT (*)
  FROM trade t, trade_summary_status s
WHERE t.trade_no = s.trade_no
   AND s.trade_summary_type_cd = 'SETSTAT'
   AND s.trade_summary_status_cd IN ('FP', 'PSF')
   AND t.trade_date < SYSDATE - 30
   AND t.trade_version_status_cd = 'A';

这样快点了吗


只看该作者    顶部
离线 wangfans
[William*Wallace]


精华贴数 3
个人空间 20
技术积分 3174 (442)
社区积分 1225 (776)
注册日期 2006-11-29
论坛徽章:20
2008年新春纪念徽章     
      

发表于 2008-5-6 10:58 


QUOTE:
原帖由 kelsoncong 于 2008-5-6 10:47 发表
为什么oracle会选择用nested loop呢?

ROLLINGPIG那个就没有


__________________
-------------------------------------------------------
Life is always like this !
------------------------------------------------------
My Blog
--------------------------------------------------------
只看该作者    顶部
离线 棉花糖ONE


精华贴数 0
个人空间 0
技术积分 12874 (84)
社区积分 1194 (777)
注册日期 2007-2-21
论坛徽章:44
现任管理团队成员地主之星蓝锆石萤石祖母绿海蓝宝石
紫水晶红宝石2008北京奥运纪念徽章:射箭2008北京奥运纪念徽章:羽毛球  

发表于 2008-5-6 11:03 
trade_summary_status 和 trade都是视图????


__________________
慢和等待都是现象,不是原因,不能把现象当原因
只看该作者    顶部
在线/呼叫 wilson2006
中级会员



精华贴数 0
个人空间 60
技术积分 869 (2069)
社区积分 45 (4855)
注册日期 2006-3-3
论坛徽章:3
      
      

发表于 2008-5-6 11:11 
3/ LCM_REPOSITORY.TRADE_SUMMARY_STATUS_KEY 是 UNIQUE INDEX  ON TRADE_SUMMARY_STATUS(TRADE_NO, TRADE_SUMMARY_TYPE_CD);
试试这个索引重建一下,交换顺序,


__________________
无事便思有闲杂念想否。有事便思有粗浮意气否。得意便思有骄矜辞色否。失意便思有怨望情怀否。
MSN: wwj7423@yahoo.com.cn
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问