查看: 5096|回复: 10

如下语句能否有优化的空间,比如能否不回表,这个NVL函数估计害死人了。

[复制链接]
论坛徽章:
16
数据库板块每日发贴之星
日期:2007-05-10 01:02:022012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262011新春纪念徽章
日期:2011-02-18 11:43:352010广州亚运会纪念徽章:乒乓球
日期:2010-10-14 10:59:16ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25数据库板块每日发贴之星
日期:2010-05-09 01:01:01数据库板块每日发贴之星
日期:2010-03-14 01:01:09数据库板块每日发贴之星
日期:2007-11-13 01:04:45ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2010-6-4 20:39 | 显示全部楼层 |阅读模式
SQL> select * from table(dbms_xplan.display_cursor('64tbakd63vhqv'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  64tbakd63vhqv, child number 0
-------------------------------------
SELECT NVL(MAX(STAFFB_ID), '-1'), NVL(MAX(STATE), '-1') FROM STAFF WHERE  STAFF_ID = :B1

Plan hash value: 2262941798

-----------------------------------------------------------------------------------------
| Id  | Operation                    | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |          |       |       |     2 (100)|          |
|   1 |  SORT AGGREGATE              |          |     1 |    11 |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID| STAFF    |     1 |    11 |     2   (0)| 00:00:01 |
|*  3 |    INDEX UNIQUE SCAN         | PK_STAFF |     1 |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------

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

   3 - access("STAFF_ID"=:B1)


21 rows selected.

SQL> select count(*) from STAFF;

  COUNT(*)
----------
      1222

SQL>


索引情况
create unique index IDX_STAFF_1 on STAFF (USER_NAME)
alter table STAFF add constraint PK_STAFF primary key (STAFF_ID)
论坛徽章:
16
数据库板块每日发贴之星
日期:2007-05-10 01:02:022012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262011新春纪念徽章
日期:2011-02-18 11:43:352010广州亚运会纪念徽章:乒乓球
日期:2010-10-14 10:59:16ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25数据库板块每日发贴之星
日期:2010-05-09 01:01:01数据库板块每日发贴之星
日期:2010-03-14 01:01:09数据库板块每日发贴之星
日期:2007-11-13 01:04:45ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
 楼主| 发表于 2010-6-4 20:39 | 显示全部楼层
想法当然是争取把
TABLE ACCESS BY INDEX ROWID
这个让他消失!

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期: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
发表于 2010-6-4 20:59 | 显示全部楼层
除非建立3列的复合索引,否则怎么可能

另外两个列从哪里取?

使用道具 举报

回复
论坛徽章:
6
BLOG每日发帖之星
日期:2009-10-06 01:01:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ITPUB9周年纪念徽章
日期:2010-10-08 09:28:53数据库板块每日发贴之星
日期:2010-12-06 01:01:01
发表于 2010-6-4 21:05 | 显示全部楼层
原帖由 fjliangrq 于 2010-6-4 20:39 发表
想法当然是争取把
TABLE ACCESS BY INDEX ROWID
这个让他消失!

你的索引没有这一列,怎么能消失呢?

使用道具 举报

回复
论坛徽章:
16
数据库板块每日发贴之星
日期:2007-05-10 01:02:022012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262011新春纪念徽章
日期:2011-02-18 11:43:352010广州亚运会纪念徽章:乒乓球
日期:2010-10-14 10:59:16ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25数据库板块每日发贴之星
日期:2010-05-09 01:01:01数据库板块每日发贴之星
日期:2010-03-14 01:01:09数据库板块每日发贴之星
日期:2007-11-13 01:04:45ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
 楼主| 发表于 2010-6-4 21:07 | 显示全部楼层
哦,我自己看错了,把STAFFB_ID看成是STAFF_ID了,建联合索引是可以的,呵呵


SQL> create index idx_union_staff on staff(staff_id,staffb_id,state);

Index created

SQL> ANALYZE TABLE STAFF COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL INDEXED COLUMNS;

Table analyzed


SQL> explain plan for
  2  SELECT NVL(MAX(STAFFB_ID), '-1'), NVL(MAX(STATE), '-1') FROM STAFF WHERE  STAFF_ID = :B1
  3  ;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 228945323
--------------------------------------------------------------------------------
| Id  | Operation         | Name            | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                 |     1 |     9 |     2   (0)| 00:00
|   1 |  SORT AGGREGATE   |                 |     1 |     9 |            |
|*  2 |   INDEX RANGE SCAN| IDX_UNION_STAFF |     1 |     9 |     2   (0)| 00:00
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("STAFF_ID"=TO_NUMBER(:B1))
Note
-----
   - 'PLAN_TABLE' is old version

18 rows selected

使用道具 举报

回复
论坛徽章:
16
数据库板块每日发贴之星
日期:2007-05-10 01:02:022012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262011新春纪念徽章
日期:2011-02-18 11:43:352010广州亚运会纪念徽章:乒乓球
日期:2010-10-14 10:59:16ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25数据库板块每日发贴之星
日期:2010-05-09 01:01:01数据库板块每日发贴之星
日期:2010-03-14 01:01:09数据库板块每日发贴之星
日期:2007-11-13 01:04:45ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
 楼主| 发表于 2010-6-4 21:12 | 显示全部楼层
粗心的毛病,呵呵!看花眼了,少看了一个B的单词。
这个语句在报表中执行次数最高,做这个索引的代价不知是否合适。
因为已经有一个主键了
是主键+另外两个的联合索引
还是直接用三个列的联合索引
这两个方案倒是有点难取舍。
性能肯定是后者高了!

使用道具 举报

回复
论坛徽章:
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
发表于 2010-6-4 21:35 | 显示全部楼层
你这么搞性能有多少提升??

使用道具 举报

回复
论坛徽章:
16
数据库板块每日发贴之星
日期:2007-05-10 01:02:022012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262011新春纪念徽章
日期:2011-02-18 11:43:352010广州亚运会纪念徽章:乒乓球
日期:2010-10-14 10:59:16ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25数据库板块每日发贴之星
日期:2010-05-09 01:01:01数据库板块每日发贴之星
日期:2010-03-14 01:01:09数据库板块每日发贴之星
日期:2007-11-13 01:04:45ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
 楼主| 发表于 2010-6-4 21:42 | 显示全部楼层
原帖由 棉花糖ONE 于 2010-6-4 21:35 发表
你这么搞性能有多少提升??

COST从11到9啊
执行次数一多,还是客观的啊

使用道具 举报

回复
论坛徽章:
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
发表于 2010-6-4 21:48 | 显示全部楼层
如果这个语句执行次数很多,最好的是single table hash cluster,表小,根据pk访问,减少索引维护

使用道具 举报

回复
论坛徽章:
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
发表于 2010-6-4 21:54 | 显示全部楼层
实际上你那个组合索引虽然避免了回表,但是语句的逻辑读没有减少,因此性能不会提升

使用道具 举报

回复

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

本版积分规则 发表回复

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号
  
快速回复 返回顶部 返回列表