楼主: Terry916

这样的sql怎么优化?

[复制链接]
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
11#
发表于 2008-3-25 11:19 | 只看该作者
参数不一样,执行的效率当然可能不一样。

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
12#
发表于 2008-3-25 11:20 | 只看该作者
铁个statspack report上来,也许看得到里面的SQL

使用道具 举报

回复
论坛徽章:
4
授权会员
日期:2010-12-06 21:04:31
13#
 楼主| 发表于 2008-3-25 11:25 | 只看该作者
好像看不到的

[ 本帖最后由 Terry916 于 2008-3-26 16:14 编辑 ]

使用道具 举报

回复
论坛徽章:
138
19周年集字徽章-19
日期:2020-06-08 08:30:56马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02路虎
日期:2013-11-22 12:26:18问答徽章
日期:2014-05-08 12:15:31
14#
发表于 2008-3-25 12:47 | 只看该作者
statspack看全表扫描比较多啊,对那个存储过程做个sql trace不成吗

[ 本帖最后由 棉花糖ONE 于 2008-3-25 13:01 编辑 ]

使用道具 举报

回复
论坛徽章:
131
2006年度最佳技术回答
日期:2007-01-24 12:58:48福特
日期:2013-10-24 13:57:422014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:142013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2008-3-25 12:54 | 只看该作者
就是这个SQL,是procedure里的主要语句,对比一下它们的CPU,buffer get , disk read就知道了
SELECT A.MOVEINQTY MOVEINQTY   
FROM OPERATION C,SPEC B,HISTORYMAINLINE A  
WHERE A.FROMSPECID = B.SPECID  
AND B.OPERATIONID = C.OPERATIONID  
AND A.CDONAME = 'MoveLot'  AND A.CONTAINERID = :b1
AND C.OPERATIONGROUPID = :b2
ORDER BY A.TXNDATE

另外再看看其他Top disk get SQL

使用道具 举报

回复
论坛徽章:
4
授权会员
日期:2010-12-06 21:04:31
16#
 楼主| 发表于 2008-3-25 13:00 | 只看该作者
trace file

trace.txt

31.81 KB, 下载次数: 6

使用道具 举报

回复
论坛徽章:
4
授权会员
日期:2010-12-06 21:04:31
17#
 楼主| 发表于 2008-3-25 13:02 | 只看该作者
原帖由 rollingpig 于 2008-3-25 12:54 发表
就是这个SQL,是procedure里的主要语句,对比一下它们的CPU,buffer get , disk read就知道了
SELECT A.MOVEINQTY MOVEINQTY   
FROM OPERATION C,SPEC B,HISTORYMAINLINE A  
WHERE A.FROMSPECID = B.SPECID  
AND B.OPERATIONID = C.OPERATIONID  
AND A.CDONAME = 'MoveLot'  AND A.CONTAINERID = :b1
AND C.OPERATIONGROUPID = :b2
ORDER BY A.TXNDATE

另外再看看其他Top disk get SQL


这个sql的确有问题,但是我在trace里面没有发现是procedure里的语句
SQL> set autotrace on
SQL> SELECT  A.MOVEINQTY MOVEINQTY   
  2  FROM
  3  OPERATION C,
  4  SPEC B,
  5  HISTORYMAINLINE A  
  6  WHERE
  7  A.FROMSPECID = B.SPECID  
  8  AND B.OPERATIONID = C.OPERATIONID  
  9  AND A.CDONAME = 'MoveLot'  
10  AND A.CONTAINERID = :b1
11  AND C.OPERATIONGROUPID = :b2
12  ORDER BY A.TXNDATE
13  /

no rows selected


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=8156 Card=1 Bytes=10
          6)

   1    0   SORT (ORDER BY) (Cost=8156 Card=1 Bytes=106)
   2    1     NESTED LOOPS (Cost=8140 Card=1 Bytes=106)
   3    2       MERGE JOIN (CARTESIAN) (Cost=8139 Card=1 Bytes=72)
   4    3         TABLE ACCESS (FULL) OF 'HISTORYMAINLINE' (Cost=8139
          Card=3 Bytes=162)

   5    3         BUFFER (SORT)
   6    5           TABLE ACCESS (BY INDEX ROWID) OF 'OPERATION'
   7    6             INDEX (RANGE SCAN) OF 'OPERATION2' (NON-UNIQUE)
   8    2       TABLE ACCESS (BY INDEX ROWID) OF 'SPEC' (Cost=1 Card=1
           Bytes=34)

   9    8         INDEX (UNIQUE SCAN) OF 'SPEC361' (UNIQUE)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      93481  consistent gets
      51472  physical reads
          0  redo size
        304  bytes sent via SQL*Net to client
        461  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL>
SQL> SELECT  /*+ORDERED*/ A.MOVEINQTY MOVEINQTY   
  2  FROM
  3  OPERATION C,
  4  SPEC B,
  5  HISTORYMAINLINE A  
  6  WHERE
  7  A.FROMSPECID = B.SPECID  
  8  AND B.OPERATIONID = C.OPERATIONID  
  9  AND A.CDONAME = 'MoveLot'  
10  AND A.CONTAINERID = :b1
11  AND C.OPERATIONGROUPID = :b2
12  ORDER BY A.TXNDATE
13  /

no rows selected


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=8158 Card=1 Bytes=10
          6)

   1    0   SORT (ORDER BY) (Cost=8158 Card=1 Bytes=106)
   2    1     HASH JOIN (Cost=8142 Card=1 Bytes=106)
   3    2       TABLE ACCESS (BY INDEX ROWID) OF 'SPEC' (Cost=1 Card=1
           Bytes=34)

   4    3         NESTED LOOPS (Cost=2 Card=1 Bytes=52)
   5    4           TABLE ACCESS (BY INDEX ROWID) OF 'OPERATION' (Cost
          =1 Card=1 Bytes=18)

   6    5             INDEX (RANGE SCAN) OF 'OPERATION2' (NON-UNIQUE)
          (Cost=1 Card=1)

   7    4           INDEX (RANGE SCAN) OF 'SPEC2' (NON-UNIQUE)
   8    2       TABLE ACCESS (FULL) OF 'HISTORYMAINLINE' (Cost=8139 Ca
          rd=3 Bytes=162)





Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
        304  bytes sent via SQL*Net to client
        461  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          0  rows processed

使用道具 举报

回复
论坛徽章:
139
2009日食纪念
日期:2009-07-22 09:30:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:21祖国60周年纪念徽章
日期:2009-10-09 08:28:002010年世界杯参赛球队:葡萄牙
日期:2010-01-18 09:23:302010年世界杯参赛球队:意大利
日期:2010-01-21 07:30:192010年世界杯参赛球队:南非
日期:2010-01-22 09:48:242010年世界杯参赛球队:加纳
日期:2010-02-13 16:34:422010新春纪念徽章
日期:2010-03-01 11:04:572010年世界杯参赛球队:斯洛伐克
日期:2010-05-21 11:24:312010年世界杯参赛球队:塞尔维亚
日期:2010-06-30 13:43:14
18#
发表于 2008-3-25 13:11 | 只看该作者
原帖由 Terry916 于 2008-3-25 13:00 发表
trace file

看起来不是这个function  YieldHandler.ExecuteData的问题。
整个过程不到很短。

使用道具 举报

回复
论坛徽章:
4
授权会员
日期:2010-12-06 21:04:31
19#
 楼主| 发表于 2008-3-25 13:13 | 只看该作者
trace 文件产生的过程
SQL> alter session set events '10046 trace name context forever';

Session altered.

SQL> variable SYS_B_00 varchar2
SQL> variable SYS_B_01 number
SQL> variable SYS_B_02 varchar2
SQL> variable SYS_B_03 varchar2
SQL> variable SYS_B_04 varchar2
SQL> variable SYS_B_05 varchar2
SQL> variable SYS_B_06 varchar2
SQL> variable SYS_B_07 varchar2
SQL> variable SYS_B_08 varchar2
SQL> variable SYS_B_09 varchar2
SQL> variable SYS_B_10 varchar2
SQL> variable SYS_B_11 varchar2
SQL> variable SYS_B_12 varchar2
SQL> variable SYS_B_13 varchar2
SQL> variable SYS_B_14 varchar2
SQL> SELECT YieldHandler.ExecuteData(:"SYS_B_00",:"SYS_B_01",:"SYS_B_02",:"SYS_B_03",:"SYS_B_04",:"SYS_B_05",:"SYS_B_06",:"SYS_B_07",
  2  :"SYS_B_08",:"SYS_B_09",:"SYS_B_10",:"SYS_B_11",:"SYS_B_12",:"SYS_B_13",:"SYS_B_14") Result FROM DUAL
  3  /

RESULT
--------------------------------------------------------------------------------
0 PASS

SQL> alter session set events '10046 trace name context off';

Session altered.

使用道具 举报

回复
论坛徽章:
139
2009日食纪念
日期:2009-07-22 09:30:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:21祖国60周年纪念徽章
日期:2009-10-09 08:28:002010年世界杯参赛球队:葡萄牙
日期:2010-01-18 09:23:302010年世界杯参赛球队:意大利
日期:2010-01-21 07:30:192010年世界杯参赛球队:南非
日期:2010-01-22 09:48:242010年世界杯参赛球队:加纳
日期:2010-02-13 16:34:422010新春纪念徽章
日期:2010-03-01 11:04:572010年世界杯参赛球队:斯洛伐克
日期:2010-05-21 11:24:312010年世界杯参赛球队:塞尔维亚
日期:2010-06-30 13:43:14
20#
发表于 2008-3-25 13:24 | 只看该作者
原帖由 Terry916 于 2008-3-25 13:13 发表
trace 文件产生的过程
SQL> alter session set events '10046 trace name context forever';

Session altered.

SQL> variable SYS_B_00 varchar2
SQL> variable SYS_B_01 number
SQL> variable SYS_B_02 varchar2
SQL> variable SYS_B_03 varchar2
SQL> variable SYS_B_04 varchar2
SQL> variable SYS_B_05 varchar2
SQL> variable SYS_B_06 varchar2
SQL> variable SYS_B_07 varchar2
SQL> variable SYS_B_08 varchar2
SQL> variable SYS_B_09 varchar2
SQL> variable SYS_B_10 varchar2
SQL> variable SYS_B_11 varchar2
SQL> variable SYS_B_12 varchar2
SQL> variable SYS_B_13 varchar2
SQL> variable SYS_B_14 varchar2
SQL> SELECT YieldHandler.ExecuteData(:"SYS_B_00",:"SYS_B_01",:"SYS_B_02",:"SYS_B_03",:"SYS_B_04",:"SYS_B_05",:"SYS_B_06",:"SYS_B_07",
  2  :"SYS_B_08",:"SYS_B_09",:"SYS_B_10",:"SYS_B_11",:"SYS_B_12",:"SYS_B_13",:"SYS_B_14") Result FROM DUAL
  3  /

RESULT
--------------------------------------------------------------------------------
0 PASS

SQL> alter session set events '10046 trace name context off';

Session altered.

执行时间不到1s钟,这个函数有什么问题需要优化?

使用道具 举报

回复

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

本版积分规则 发表回复

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