查看: 3477|回复: 11

[性能调整] 请教一个sql优化问题

[复制链接]
论坛徽章:
16
奥运会纪念徽章:花样游泳
日期:2008-10-24 13:28:54咸鸭蛋
日期:2012-11-29 00:23:19奥运会纪念徽章:体操
日期:2012-10-25 00:22:23ITPUB十周年纪念徽章
日期:2011-11-01 16:24:512011新春纪念徽章
日期:2011-04-13 21:06:552011新春纪念徽章
日期:2011-02-18 11:42:472010新春纪念徽章
日期:2010-03-01 11:06:12生肖徽章2007版:猪
日期:2009-05-21 23:20:14生肖徽章2007版:虎
日期:2009-04-25 15:17:39生肖徽章2007版:龙
日期:2009-03-10 21:27:46
发表于 2009-12-30 12:05 | 显示全部楼层 |阅读模式
请教一个sql优化问题,版本:10.2.0.4.0  , RECEPTION一直走全表,使用NO_EXPAND提示没什么效果,请大家帮忙看看怎么优化!

select *
  from RECEPTION A
where (A.RECORGID = :ORGID or
       A.RECORGID in (select ORGID
                         from ORGANIZATION B
                        where exists (select 1
                                 from ORGANIZATION_CHILD
                                where SUBWAYID = B.ORGID
                                  and PARWAYID = :ORGID)))
   and A.RECDATE between :SDATE and :EDATE
   and A.REGION = 311
   and (A.ISBACKPROCESS <> 1 or A.ISBACKPROCESS is null)
   and ROWNUM < :ROWNUMBER
order by oid;



Plan hash value: 2299894236

--------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name              | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                   |  5234 |  1139K|       |  2290K  (3)| 04:29:04 |       |       |
|*  1 |  FILTER                      |                   |       |       |       |            |          |       |       |
|   2 |   SORT ORDER BY              |                   |  5234 |  1139K|    62M|  2290K  (3)| 04:29:04 |       |       |
|*  3 |    COUNT STOPKEY             |                   |       |       |       |            |          |       |       |
|*  4 |     FILTER                   |                   |       |       |       |            |          |       |       |
|   5 |      PARTITION RANGE ITERATOR|                   |   104K|    22M|       |  2286K  (3)| 04:28:33 |   KEY |   KEY |
|*  6 |       TABLE ACCESS FULL      | RECEPTION         |   104K|    22M|       |  2286K  (3)| 04:28:33 |   KEY |   KEY |
|   7 |      NESTED LOOPS            |                   |     1 |    44 |       |     3   (0)| 00:00:01 |       |       |
|*  8 |       INDEX UNIQUE SCAN      | PK_T_UCP_ORGAINFO |     1 |    17 |       |     2   (0)| 00:00:01 |       |       |
|*  9 |       INDEX UNIQUE SCAN      | PK_UCP_ORGACHILD  |     1 |    27 |       |     1   (0)| 00:00:01 |       |       |
--------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(TO_DATE(:SDATE)<=TO_DATE(:EDATE))
   3 - filter(ROWNUM<TO_NUMBER(:ROWNUMBER))
   4 - filter("A"."RECORGID"=:ORGID OR  EXISTS (SELECT /*+ */ 0 FROM "COMMON"."T_UCP_ORGAINFO"
              "ORG","COMMON"."T_UCP_ORGACHILD" "ORGANIZATION_CHILD" WHERE "SUBWAYID"=:B1 AND "PARWAYID"=:ORGID AND
              "ORG"."ORGAID"=:B2))
   6 - filter("A"."REGION"=311 AND ("A"."ISBACKPROCESS"<>1 OR "A"."ISBACKPROCESS" IS NULL) AND
              "A"."RECDATE">=:SDATE AND "A"."RECDATE"<=:EDATE)
   8 - access("ORG"."ORGAID"=:B1)
   9 - access("PARWAYID"=:ORGID AND "SUBWAYID"=:B1)
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期: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
发表于 2009-12-30 12:37 | 显示全部楼层
把or拆开成union

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2009-12-30 13:21 | 显示全部楼层


Try!


select  *
  from
(select *
  from RECEPTION A
where  A.RECORGID = :ORGID
   and A.RECDATE between :SDATE and :EDATE
   and A.REGION = 311
   and nvl(A.ISBACKPROCESS, 0) <> 1
union
select *
  from RECEPTION A
where A.RECORGID <> :ORGID
   and exists(select 1
               from ORGANIZATION B
              where exists(select 1
                             from ORGANIZATION_CHILD C
                            where C.SUBWAYID = B.ORGID
                              and C.PARWAYID = :ORGID)
              where B.ORGID = A.A.RECORGID)
   and A.RECDATE between :SDATE and :EDATE
   and A.REGION = 311
   and nvl(A.ISBACKPROCESS, 0) <> 1)
where rownum < :ROWNUMBER
order by oid;



[ 本帖最后由 bell6248 于 2009-12-30 13:53 编辑 ]

使用道具 举报

回复
论坛徽章:
2
2010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:20:05
发表于 2009-12-30 13:52 | 显示全部楼层
|   5 |      PARTITION RANGE ITERATOR|                   |   104K|    22M|       |  2286K  (3)| 04:28:33 |   KEY |   KEY |
|*  6 |       TABLE ACCESS FULL      | RECEPTION         |   104K|    22M|       |  2286K  (3)| 04:28:33 |   KEY |   KEY |

走的不是全表。《PARTITION RANGE ITERATOR》 只是分区扫描。

使用道具 举报

回复
论坛徽章:
13
生肖徽章2007版:蛇
日期:2009-09-29 15:44:15ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152010年世界杯参赛球队:日本
日期:2010-05-04 17:51:192010年世界杯参赛球队:南非
日期:2010-04-28 10:07:122010年世界杯参赛球队:希腊
日期:2010-04-23 16:19:412010新春纪念徽章
日期:2010-03-01 11:08:342010年世界杯参赛球队:科特迪瓦
日期:2010-01-27 14:47:432010年世界杯参赛球队:意大利
日期:2010-01-25 08:58:012010新春纪念徽章
日期:2010-01-04 08:33:08生肖徽章2007版:鼠
日期:2009-11-10 11:54:09
发表于 2009-12-30 14:11 | 显示全部楼层
mark

使用道具 举报

回复
论坛徽章:
13
生肖徽章2007版:蛇
日期:2009-09-29 15:44:15ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152010年世界杯参赛球队:日本
日期:2010-05-04 17:51:192010年世界杯参赛球队:南非
日期:2010-04-28 10:07:122010年世界杯参赛球队:希腊
日期:2010-04-23 16:19:412010新春纪念徽章
日期:2010-03-01 11:08:342010年世界杯参赛球队:科特迪瓦
日期:2010-01-27 14:47:432010年世界杯参赛球队:意大利
日期:2010-01-25 08:58:012010新春纪念徽章
日期:2010-01-04 08:33:08生肖徽章2007版:鼠
日期:2009-11-10 11:54:09
发表于 2009-12-30 15:09 | 显示全部楼层

回复 #2 棉花糖ONE 的帖子

hi

能分析下为什么这么拆分吗?
union 的性能会好很多吗?

使用道具 举报

回复
论坛徽章:
0
发表于 2009-12-30 15:34 | 显示全部楼层
关键是因为你的语句中条件 A.ISBACKPROCESS is null  这会导致优化器无法使用表RECEPTION上的索引

使用道具 举报

回复
论坛徽章:
10
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152011新春纪念徽章
日期:2011-05-06 16:49:002011新春纪念徽章
日期:2011-02-18 11:43:33ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010新春纪念徽章
日期:2010-03-01 11:07:22生肖徽章2007版:鸡
日期:2009-09-28 12:51:472009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:鼠
日期:2008-01-02 17:35:53劳斯莱斯
日期:2013-12-16 10:42:54
发表于 2009-12-30 15:53 | 显示全部楼层
是你的 or语句存在问题,使用or 会屏蔽掉索引而走全扫,将or拆开 用union  
is null 没有影响

使用道具 举报

回复
论坛徽章:
0
发表于 2009-12-30 16:15 | 显示全部楼层
or 会屏蔽索引?什么情况下,

使用道具 举报

回复
论坛徽章:
16
奥运会纪念徽章:花样游泳
日期:2008-10-24 13:28:54咸鸭蛋
日期:2012-11-29 00:23:19奥运会纪念徽章:体操
日期:2012-10-25 00:22:23ITPUB十周年纪念徽章
日期:2011-11-01 16:24:512011新春纪念徽章
日期:2011-04-13 21:06:552011新春纪念徽章
日期:2011-02-18 11:42:472010新春纪念徽章
日期:2010-03-01 11:06:12生肖徽章2007版:猪
日期:2009-05-21 23:20:14生肖徽章2007版:虎
日期:2009-04-25 15:17:39生肖徽章2007版:龙
日期:2009-03-10 21:27:46
 楼主| 发表于 2009-12-30 16:40 | 显示全部楼层
原帖由 棉花糖ONE 于 2009-12-30 12:37 发表
把or拆开成union


通过union,执行效率得到提升, 使用or的时候oracle 不走索引么?
explain plan for
select *
  from (select A.oid
          from RECEPTION A
         where (A.RECORGID = :ORGID)
           and A.RECDATE between :SDATE and :EDATE
           and A.REGION = 311
           and (A.ISBACKPROCESS <> 1 or A.ISBACKPROCESS is null)
           and ROWNUM < :ROWNUMBER
        union
        select A.oid
          from RECEPTION A
         where (A.RECORGID in (select ORGID
                                 from ORGANIZATION B
                                where exists (select 1
                                         from ORGANIZATION_CHILD
                                        where SUBWAYID = B.ORGID
                                          and PARWAYID = :ORGID)))
           and A.RECDATE between :SDATE and :EDATE
           and A.REGION = 311
           and (A.ISBACKPROCESS <> 1 or A.ISBACKPROCESS is null)
           and ROWNUM < :ROWNUMBER)
order by oid;


Plan hash value: 1993454495

---------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name                   | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                        |    28 |   364 |  9059   (1)| 00:01:04 |       |       |
|   1 |  SORT ORDER BY                         |                        |    28 |   364 |  9059   (1)| 00:01:04 |       |       |
|   2 |   VIEW                                 |                        |    28 |   364 |  9058   (1)| 00:01:04 |       |       |
|   3 |    UNION-ALL                           |                        |       |       |            |          |       |       |
|*  4 |     COUNT STOPKEY                      |                        |       |       |            |          |       |       |
|   5 |      PARTITION RANGE ITERATOR          |                        |    12 |   420 |   711   (1)| 00:00:06 |   KEY |   KEY |
|*  6 |       TABLE ACCESS BY LOCAL INDEX ROWID| RECEPTION              |    12 |   420 |   711   (1)| 00:00:06 |   KEY |   KEY |
|*  7 |        INDEX RANGE SCAN                | IDX_RECEPTION_RECORGID |   299 |       |   472   (0)| 00:00:04 |   KEY |   KEY |
|*  8 |     COUNT STOPKEY                      |                        |       |       |            |          |       |       |
|*  9 |      TABLE ACCESS BY LOCAL INDEX ROWID | RECEPTION              |     1 |    35 |   710   (1)| 00:00:06 |     1 |     1 |
|  10 |       NESTED LOOPS                     |                        |    16 |  1264 |  8347   (1)| 00:00:59 |       |       |
|  11 |        NESTED LOOPS                    |                        |    17 |   748 |    13   (8)| 00:00:01 |       |       |
|  12 |         SORT UNIQUE                    |                        |    17 |   459 |     3   (0)| 00:00:01 |       |       |
|* 13 |          INDEX RANGE SCAN              | PK_UCP_ORGACHILD       |    17 |   459 |     3   (0)| 00:00:01 |       |       |
|* 14 |         INDEX UNIQUE SCAN              | PK_T_UCP_ORGAINFO      |     1 |    17 |     1   (0)| 00:00:01 |       |       |
|  15 |        PARTITION RANGE ITERATOR        |                        |   299 |       |   471   (0)| 00:00:04 |   KEY |   KEY |
|* 16 |         INDEX RANGE SCAN               | IDX_RECEPTION_RECORGID |   299 |       |   471   (0)| 00:00:04 |   KEY |   KEY |
---------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter(ROWNUM<TO_NUMBER(:ROWNUMBER))
   6 - filter("A"."REGION"=311 AND ("A"."ISBACKPROCESS"<>1 OR "A"."ISBACKPROCESS" IS NULL))
   7 - access("A"."RECORGID"=:ORGID AND "A"."RECDATE">=:SDATE AND "A"."RECDATE"<=:EDATE)
   8 - filter(ROWNUM<TO_NUMBER(:ROWNUMBER))
   9 - filter("A"."REGION"=311 AND ("A"."ISBACKPROCESS"<>1 OR "A"."ISBACKPROCESS" IS NULL))
  13 - access("PARWAYID"=:ORGID)
  14 - access("SUBWAYID"="ORG"."ORGAID")
  16 - access("A"."RECORGID"="ORG"."ORGAID" AND "A"."RECDATE">=:SDATE AND "A"."RECDATE"<=:EDATE)

使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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