ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 476|回复: 15

[性能调整] 执行计划于绑定变量

[复制链接]
认证徽章
论坛徽章:
0
发表于 2017-7-14 16:31 | 显示全部楼层 |阅读模式
今天做测试
create  tt as select * from dba_objects;
insert into tt select * from tt;  
直到tt 达到400w数据,过程中 使用绑定变量 发现 无论绑定变量是何值,执行计划都会走索引
我试过清空shared_pool 也没什么效果,用 真值 去代替 执行计划 就没什么问题。统计信息是最新的,
rows那里的信息不大对,可是为什么不对啊,这个执行计划啥原因? 附件是10053

SQL> select count(*) from tt;

  COUNT(*)
----------
   4760768


SQL> select count(*) from tt where object_id>1000 and object_id<900000;

  COUNT(*)
----------
   4696704


exec  :BIND_1   := 1000;
exec  :BIND_3   := 900000;
SQL> select * from tt where object_id>:BIND_1  and object_id<:BIND_3 ;

4696704 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3098175517

---------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name          | Rows  | Bytes | Cost (%CPU)| Time          |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                  | 11902 |  1534K| 21492   (1)| 00:00:01 |
|*  1 |  FILTER                              |                  |          |          |               |          |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| TT          | 11902 |  1534K| 21492   (1)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN                     | IDX_TT_OID | 21423 |          |    63   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------









认证徽章
论坛徽章:
0
发表于 2017-7-14 16:35 | 显示全部楼层
附件补上!!!

orcl_ora_15197_optimizer.rar

1.51 MB, 下载次数: 5

10053

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-02-22 15:16:26
发表于 2017-7-14 17:10 | 显示全部楼层
object_id列有没有直方图统计信息

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2017-7-14 17:41 | 显示全部楼层
latch_free 发表于 2017-7-14 17:10
object_id列有没有直方图统计信息

有直方图的统计信息

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2017-7-14 17:57 | 显示全部楼层
更奇怪的是,加了提示也不走索引
select/*+ cardinality(tt 4000000)*/ * from tt where object_id>:BIND_1  and object_id<:BIND_3 ;

4696704 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3098175517

---------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name          | Rows  | Bytes | Cost (%CPU)| Time          |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                  |  4000K|   503M| 21721   (1)| 00:00:01 |
|*  1 |  FILTER                              |                  |          |          |               |          |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| TT          |  4000K|   503M| 21721   (1)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN                     | IDX_TT_OID | 21651 |          |    64   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------

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

   1 - filter(TO_NUMBER(:BIND_3)>TO_NUMBER(:BIND_1))
   3 - access("OBJECT_ID">TO_NUMBER(:BIND_1) AND "OBJECT_ID"<TO_NUMBER(:BIND_3))


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

SQL>

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-02-22 15:16:26
发表于 2017-7-15 11:42 | 显示全部楼层
本帖最后由 latch_free 于 2017-7-15 12:11 编辑

别用explain for语句,通过dbms_xplan.display_cursor查看执行计划

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-02-22 15:16:26
发表于 2017-7-15 12:12 | 显示全部楼层
另外看你的10053输出,是存在走全表的执行计划的
sql_id=0k4fyxc740t59 plan_hash_value=1716564399 problem_type=3
----- Current SQL Statement for this session (sql_id=0k4fyxc740t59) -----
select * from tt where object_id>:BIND_1  and object_id<:BIND_3
sql_text_length=65
sql=select * from tt where object_id>:BIND_1  and object_id<:BIND_3
----- Explain Plan Dump -----
----- Plan Table -----

============
Plan Table
============
--------------------------------------+-----------------------------------+
| Id  | Operation           | Name    | Rows  | Bytes | Cost  | Time      |
--------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT    |         |       |       |   25K |           |
| 1   |  FILTER             |         |       |       |       |           |
| 2   |   TABLE ACCESS FULL | TT      | 4591K |  592M |   25K |  00:05:03 |
--------------------------------------+-----------------------------------+

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2017-7-17 08:45 | 显示全部楼层
latch_free 发表于 2017-7-15 12:12
另外看你的10053输出,是存在走全表的执行计划的
sql_id=0k4fyxc740t59 plan_hash_value=1716564399 probl ...

是存在,可是后期 他为啥认为 走全表反而不如 走索引呢

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2017-7-17 09:01 | 显示全部楼层
Access Path: TableScan
    Cost:  25151.123493  Resp: 25151.123493  Degree: 0
      Cost_io: 25087.000000  Cost_cpu: 2414414014
      Resp_io: 25087.000000  Resp_cpu: 2414414014
****** Costing Index IDX_TT_OID
  SPD: Return code in qosdDSDirSetup: NOCTX, estType = INDEX_SCAN
  SPD: Return code in qosdDSDirSetup: NOCTX, estType = INDEX_FILTER
  Access Path: index (RangeScan)
    Index: IDX_TT_OID
    resc_io: 21487.000000  resc_cpu: 171228781
    ix_sel: 0.004547  ix_sel_with_filters: 0.004547
    Cost: 21491.547599  Resp: 21491.547599  Degree: 1
****** Costing Index ID_TT_ID_NAME
  SPD: Return code in qosdDSDirSetup: NOCTX, estType = INDEX_SCAN
  SPD: Return code in qosdDSDirSetup: NOCTX, estType = INDEX_FILTER
  SPD: Return code in qosdDSDirSetup: NOCTX, estType = INDEX_SKIP_SCAN
  Access Path: index (RangeScan)
    Index: ID_TT_ID_NAME
    resc_io: 21734.000000  resc_cpu: 173088927
    ix_sel: 0.004500  ix_sel_with_filters: 0.004500
    Cost: 21738.597002  Resp: 21738.597002  Degree: 1
  ****** trying bitmap/domain indexes ******
  ****** finished trying bitmap/domain indexes ******
  Best:: AccessPath: IndexRange
  Index: IDX_TT_OID
         Cost: 21491.547599  Degree: 1  Resp: 21491.547599  Card: 11901.920000  Bytes: 0.000000
10053里也显示  index 更好,


统计信息
BASE STATISTICAL INFORMATION
***********************
Table Stats::
  Table: TT  Alias: TT
  #Rows: 4760768  SSZ: 0  LGR: 0  #Blks:  92621  AvgRowLen:  132.00  NEB: 0  ChainCnt:  0.00  ScanRate:  0.00  SPC: 0  RFL: 0  RNF: 0  CBK: 0  CHR: 0  KQDFLG: 1
  #IMCUs: 0  IMCRowCnt: 0  IMCJournalRowCnt: 0  #IMCBlocks: 0  IMCQuotient: 0.000000
Index Stats::
  Index: IDX_TT_OID  Col#: 4
  LVLS: 2  #LB: 13365  #DK: 74976  LB/K: 1.00  DB/K: 62.00  CLUF: 4711860.00  NRW: 4711860.00 SSZ: 0.00 LGR: 0.00 CBK: 0.00 GQL: 0.00 CHR: 0.00 KQDFLG: 8192 BSZ: 1
  KKEISFLG: 1
  Index: ID_TT_ID_NAME  Col#: 4 2
  LVLS: 2  #LB: 41833  #DK: 74976  LB/K: 1.00  DB/K: 64.00  CLUF: 4787241.00  NRW: 4787278.00 SSZ: 0.00 LGR: 0.00 CBK: 0.00 GQL: 0.00 CHR: 0.00 KQDFLG: 8192 BSZ: 1
  KKEISFLG: 1
try to generate single-table filter predicates from ORs for query block SEL$1 (#0)
finally: "TT"."OBJECT_ID">TO_NUMBER(:B1) AND "TT"."OBJECT_ID"<TO_NUMBER(:B2) AND TO_NUMBER(:B3)>TO_NUMBER(:B4)

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-02-22 15:16:26
发表于 2017-7-17 09:16 | 显示全部楼层
执行计划最好不要用explain看,有时不准,你先获取准确的执行计划吧

使用道具 举报

回复

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

本版积分规则

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