网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.Oracle DBA 回滚段管理试题选.
.让数据库“安居”到Linux上.
.如何单独备份一个或多个用户?.
.Oracle数据字典的介绍与应用实例.
.如何用保存数据库连接参数代码及.
.Oracle数据库的灾难恢复.
.讲解Oracle中JOB与存储过程的接合.
.ORACLE SQL性能优化系列(五).
.Oracle DBA 用户管理试题选.
.Oracle 8i特性.
.实例讲解Oracle到SQL Server主键.
.清楚理解限制(limit)系列.
.创建访问非Oracle文件的外部表格.
.ORACLE入门之ORACLE的备份.
.PL/SQL构建代码分析工具之从测试.
.Fontconfig用户手册.
.Oracle数据库联机日志文件丢失处.
.Oracle中imp导入相同的两个用户的.
.Linux 网管 123 --- 升级 Linux.
.Unix环境下的Oracle调优.

一个SQL的优化过程

发表日期:2008-2-9



  1652
  ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
  
  0
  select GAME_CARD_TYPE.NAME,
  GAME.NAME GameName,
  sum(V_SALE_TMP_LOG.GAME_CARD_NUM) as num,
  sum(V_SALE_TMP_LOG.CITY_AGENT_COST) as sumSalePrice,
  sum(V_SALE_TMP_LOG.PROVINCE_AGENT_COST) as basePrice,
  V_SALE_TMP_LOG.SALE_MODE
  from V_SALE_TMP_LOG,
  GAME_CARD_TYPE,
  GAME,
  RESELLER_BASE,
  AGENT_BASE c,
  AGENT_BASE d
  where (V_SALE_TMP_LOG.SALE_MODE=2 or V_SALE_TMP_LOG.SALE_MODE=3 or V_SALE_TMP_LOG.SALE_MODE=4)
  and V_SALE_TMP_LOG.GAME_CARD_TYPE_ID=GAME_CARD_TYPE.GAME_CARD_TYPE_ID(+)
  and GAME_CARD_TYPE.GAME_ID=GAME.GAME_ID(+)
  and V_SALE_TMP_LOG.RESELLER_ID=RESELLER_BASE.RESELLER_ID
  and RESELLER_BASE.AGENT_ID=c.AGENT_ID
  and c.PARENT_AGENT_ID = d.AGENT_ID
  and V_SALE_TMP_LOG.IS_SUCCESS='Y'
  and d.AGENT_ID=52080
  and V_SALE_TMP_LOG.LOG_TIME>=to_date('2004-05-04 00:00:00','yyyy-mm-dd HH24:MI:SS') and V_SALE_TMP_LOG.LOG_TIME<=to_date('2004-07-04 23:59:59','yyyy-mm-dd HH24:MI:SS')
  GROUP BY GAME.name,
  GAME_CARD_TYPE.NAME,
  V_SALE_TMP_LOG.SALE_MODE
  ORDER BY -sum(V_SALE_TMP_LOG.CITY_AGENT_COST) DESC,sum(V_SALE_TMP_LOG.GAME_CARD_NUM) DESC
  
  这个SQL在执行时将2G的TEMP表空间溢出来,通过lecco sql ecpert对该SQL做了分析
  
一个SQL的优化过程

  SQL> l
  1 select GAME_CARD_TYPE.NAME,
  2                 GAME.NAME GameName,
  3                 sum(V_SALE_TMP_LOG.GAME_CARD_NUM) as num,
  4                 sum(V_SALE_TMP_LOG.CITY_AGENT_COST) as sumSalePrice,
  5                 sum(V_SALE_TMP_LOG.PROVINCE_AGENT_COST) as basePrice,
  6                 V_SALE_TMP_LOG.SALE_MODE
  7              from V_SALE_TMP_LOG,
  8                GAME_CARD_TYPE,
  9                GAME,
  10                RESELLER_BASE,
  11                AGENT_BASE c,
  12                AGENT_BASE d
  13              where (V_SALE_TMP_LOG.SALE_MODE=2 or V_SALE_TMP_LOG.SALE_MODE=3 or V_SALE_TMP_LOG.SALE_MODE=4)
  14                 and V_SALE_TMP_LOG.GAME_CARD_TYPE_ID=GAME_CARD_TYPE.GAME_CARD_TYPE_ID(+)
  15                 and GAME_CARD_TYPE.GAME_ID=GAME.GAME_ID(+)
  16                 and V_SALE_TMP_LOG.RESELLER_ID=RESELLER_BASE.RESELLER_ID
  17                 and RESELLER_BASE.AGENT_ID=c.AGENT_ID
  18                 and c.PARENT_AGENT_ID = d.AGENT_ID
  19                 and V_SALE_TMP_LOG.IS_SUCCESS='Y'
  20                 and d.AGENT_ID=52080
  21                 and V_SALE_TMP_LOG.LOG_TIME>=to_date('2004-05-04 00:00:00','yyyy-mm-dd HH24:MI:SS') and V_SALE_TMP_LOG.LOG_TIME<
=to_date('2004-07-04 23:59:59','yyyy-mm-dd HH24:MI:SS')
  22              GROUP BY GAME.name,
  23                  GAME_CARD_TYPE.NAME,
  24                  V_SALE_TMP_LOG.SALE_MODE
  25              ORDER BY -sum(V_SALE_TMP_LOG.CITY_AGENT_COST) DESC,sum(V_SALE_TMP_LOG.GAME_CARD_NUM) DESC
  26*
  SQL>
  
  162 rows selected.
  
  Elapsed: 00:00:00.77
  
  Execution Plan
  ----------------------------------------------------------
  0   SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2043 Card=334 Byte
  s=26386)
  
  1  0  SORT (ORDER BY) (Cost=2043 Card=334 Bytes=26386)
  2  1   SORT (GROUP BY) (Cost=2043 Card=334 Bytes=26386)
  3  2    HASH JOIN (OUTER) (Cost=1969 Card=334 Bytes=26386)
  4  3     HASH JOIN (OUTER) (Cost=1964 Card=334 Bytes=21710)
  5  4      NESTED LOOPS (Cost=1959 Card=334 Bytes=16032)
  6  5       NESTED LOOPS (Cost=13 Card=47 Bytes=893)
  7  6        NESTED LOOPS (Cost=4 Card=1 Bytes=12)
  8  7         INDEX (UNIQUE SCAN) OF 'SYS_C0010232' (UNIQU
  E) (Cost=1 Card=1 Bytes=4)
  
  9  7         TABLE Access (BY INDEX ROWID) OF 'AGENT_BASE
  ' (Cost=3 Card=1 Bytes=8)
  
  10  9          INDEX (RANGE SCAN) OF 'IDX_BASE_AGENT_ID'
  (NON-UNIQUE) (Cost=1 Card=1)
  
  11  6        TABLE ACCESS (BY INDEX ROWID) OF 'RESELLER_BAS
  E' (Cost=10 Card=47 Bytes=329)
  
  12  11         INDEX (RANGE SCAN) OF 'IDX_RESELLER_BASE_AGE
  NT_ID' (NON-UNIQUE) (Cost=1 Card=47)
  
  13  5       VIEW OF 'V_SALE_TMP_LOG' (Cost=42 Card=7 Bytes=2
  03)
  
  14  13        UNION-ALL (PARTITION)
  15  14         TABLE ACCESS (BY INDEX ROWID) OF 'SALE_TMP_L
  OG' (Cost=22 Card=26 Bytes=728)
  
  16  15          INDEX (RANGE SCAN) OF 'IDX_RESEID_STL' (NO
  N-UNIQUE) (Cost=3 Card=79)
  
  17  14         TABLE ACCESS (BY GLOBAL INDEX ROWID) OF 'SAL
  E_TMP_LOG_DELETED' (Cost=2 Card=1 Bytes=28)
  
  18  17          INDEX (RANGE SCAN) OF 'IDX_SALE_DELETED_LO
  G_TIME' (NON-UNIQUE) (Cost=3 Card=1)
  
  19  4      TABLE ACCESS (FULL) OF 'GAME_CARD_TYPE' (Cost=4 Ca
  rd=1084 Bytes=18428)
  
  20  3     TABLE ACCESS (FULL) OF 'GAME' (Cost=4 Card=218 Bytes
  =3052)
  
  Statistics
  ----------------------------------------------------------
  357 recursive calls
  0 db block gets
  41519 consistent gets
  924 physical reads
  0 redo size
  7929 bytes sent via SQL*Net to client
  609 bytes received via SQL*Net from client
  12 SQL*Net roundtrips to/from client
  2 sorts (memory)
  0 sorts (disk)
  162 rows processed
  
  这是源SQL执行后的结果
  
  SQL> l
  1 select /*+ USE_HASH(V_SALE_TMP_LOG) */ GAME_CARD_TYPE.NAME,
  2     GAME.NAME GameName,
  3     sum(V_SALE_TMP_LOG.GAME_CARD_NUM) as num,
  4     sum(V_SALE_TMP_LOG.CITY_AGENT_COST) as sumSalePrice,
  5     sum(V_SALE_TMP_LOG.PROVINCE_AGENT_COST) as basePrice,
  6     V_SALE_TMP_LOG.SALE_MODE
  7  from V_SALE_TMP_LOG,
  8     GAME_CARD_TYPE,
  9     GAME,
  10     RESELLER_BASE,
  11     AGENT_BASE c,
  12     AGENT_BASE d
  13  where (V_SALE_TMP_LOG.SALE_MODE = 2
  14      or V_SALE_TMP_LOG.SALE_MODE = 3
  15      or V_SALE_TMP_LOG.SALE_MODE = 4)
  16   and V_SALE_TMP_LOG.GAME_CARD_TYPE_ID = GAME_CARD_TYPE.GAME_CARD_TYPE_ID (+)
  17   and GAME_CARD_TYPE.GAME_ID = GAME.GAME_ID (+)
  18   and V_SALE_TMP_LOG.RESELLER_ID = RESELLER_BASE.RESELLER_ID
  19   and RESELLER_BASE.AGENT_ID = c.AGENT_ID
  20   and c.PARENT_AGENT_ID = d.AGENT_ID
  21   and V_SALE_TMP_LOG.IS_SUCCESS = 'Y'
  22   and d.AGENT_ID = 52080
  23   and V_SALE_TMP_LOG.LOG_TIME >
= to_date('2004-05-04 00:00:00', 'yyyy-mm-dd HH24:MI:SS')
  24   and V_SALE_TMP_LOG.LOG_TIME <= to_date('2004-07-04 23:59:59', 'yyyy-mm-dd HH24:MI:SS')
  25  GROUP BY GAME.name,
  26      GAME_CARD_TYPE.NAME,
  27      V_SALE_TMP_LOG.SALE_MODE
  28  ORDER BY -sum(V_SALE_TMP_LOG.CITY_AGENT_COST) DESC,
  29      sum(V_SALE_TMP_LOG.GAME_CARD_NUM) DESC
  30*
  
  162 rows selected.
  
  Elapsed: 00:00:04.09
  
  Execution Plan
  ----------------------------------------------------------
  0   SELECT STATEMENT Optimizer=ALL_ROWS (Cost
上一篇:Oracle和IBM将XML索引能力加入数据库 人气:995
下一篇:如何在oracle中用SQL创建临时表? 人气:1795
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐