Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

6

主题
1#
发表于 2013-12-11 20:11:19 | 查看: 5977| 回复: 5
本帖最后由 SKYLINE.LIU 于 2013-12-12 09:48 编辑

数据库版本 11.1.0.7.0

SQL语句
select count(*)
    from xcxt.t_sj_sjjbxx sj
   inner join xcxt.t_sys_organization org
      on org.orgcode = sj.bldwid
   where sj.lrrq >= to_date('2013-11-01', 'yyyy-mm-dd hh24:mi:ss')
     and sj.lrrq < to_date('2013-11-30', 'yyyy-mm-dd hh24:mi:ss')
     and org.treepath like '11000000000000.11010600000000' || '%'

默认使用NESTED LOOPS 方式,逻辑读很大 188731,首次执行时间为6~8s
强制使用HASH JOIN 方式,逻辑读降为 1117,首次执行时间 小于1s

t_sj_sjjbxx  lrrq 每天的数据量 8000~10000左右

表数据量情况
T_SJ_SJJBXX 5550289
T_SYS_ORGANIZATION 3522


组合索引情况
t_sj_sjjbxx  lrrq,bldwid
t_sys_organization  treepath,orgcode
  1. INDEX_NAME        DISTINCT_KEYS        NUM_ROWS        BLEVEL        LEAF_BLOCKS        CLUSTERING_FACTOR
  2. INDEX_SJ_SJJBXX_RQDW        4908281        5526878        2        26028        4734152
  3. CIX_SYS_ORGANIZATION_TREECODE        3522        3522        1        40        444
复制代码
索引列统计信息
  1. TABLE_NAME        COLUMN_NAME        NUM_DISTINCT        NUM_NULLS        NUM_BUCKETS        DENSITY
  2. T_SJ_SJJBXX        BLDWID        575        88460        1        0.00173913043478261
  3. T_SJ_SJJBXX        LRRQ        792962        2020        1        1.26109447867615E-6
  4. T_SYS_ORGANIZATION        ORGCODE        3517        0        1        0.000284333238555587
  5. T_SYS_ORGANIZATION        TREEPATH        3517        0        1        0.000284333238555587
复制代码
获取了语句的10053与10046trace,请各位专家给看看,除了使用Hint 使语句走HASH JOIN 外,还有没有其他办法?

附:
1、建立t_sys_organization  的临时表,创建 treepath,orgcode 的组合索引,使用临时表查询,语句使用 hash join 方式,收集临时表统计信息后,执行计划变为 NESTED LOOPS
2、生产环境不建议使用 hint 呀

HASH_JOIN执行计划.txt

2.49 KB, 下载次数: 578

默认NL执行计划.txt

2.5 KB, 下载次数: 546

sqlhc_nl.html

34.68 KB, 下载次数: 546

sqlhc_hash_join.html

23.1 KB, 下载次数: 538

TRACE文件.rar

38.92 KB, 下载次数: 1366

2#
发表于 2013-12-12 09:30:53
本帖最后由 SKYLINE.LIU 于 2013-12-12 10:41 编辑
  1. SQL> select count(1) from xcxt.t_sys_organization org
  2.   2  where org.treepath like '11000000000000.11010600000000' || '%'
  3.   3  /

  4.   COUNT(1)
  5. ----------
  6.        157

  7. Elapsed: 00:00:00.01
  8. SQL> select count(1) from xcxt.t_sj_sjjbxx sj
  9.   2  where sj.lrrq >= to_date('2013-11-01', 'yyyy-mm-dd hh24:mi:ss')
  10.   3     and sj.lrrq < to_date('2013-11-30', 'yyyy-mm-dd hh24:mi:ss')
  11.   4  /

  12.   COUNT(1)
  13. ----------
  14.     253707

  15. Elapsed: 00:00:07.19
  16. SQL> select count(1) from xcxt.t_sj_sjjbxx sj
  17.   2  where sj.lrrq >= to_date('2013-09-01', 'yyyy-mm-dd hh24:mi:ss')
  18.   3     and sj.lrrq < to_date('2013-09-30', 'yyyy-mm-dd hh24:mi:ss')
  19.   4  /

  20.   COUNT(1)
  21. ----------
  22.     234159

  23. Elapsed: 00:00:00.92
复制代码

sjxx_tkprof.trc.txt

6.94 KB, 下载次数: 1120

sjxx.trc.txt

256 KB, 下载次数: 536

回复 显示全部楼层 道具 举报

3#
发表于 2013-12-13 10:20:19
补充信息:
T_SJ_SJJBXX 分析表 gather_table_stats estimate_percent 采样行的百分比为5%时,LRRQ列字段的distinct _keys 为79W,与实际不同值数差别很大,实际distinct _keys为 460W

在正式环境测试了 LRRQ区间间隔 几天,1个月,1年,使用HASH_JOIN方式比使用NESTED_LOOPS方式效率要高

各位专家,像这种ORACLE选择错误的执行计划的情况,大家通常采取什么方式处理呢?
我所想到的就是加HINT与使用sql profile固定执行计划,加HINT方式,开发一般不会同意。

期待各位专家支招~

回复 显示全部楼层 道具 举报

4#
发表于 2013-12-13 13:46:24
T_SYS_ORGANIZATION 这个表是机构表,95%以上数据是2011年底系统上线时初始化进去的,一年变动的机构不超过20个,而且这个表的数据量很小,数据才3000多

回复 显示全部楼层 道具 举报

5#
发表于 2013-12-16 17:41:57

  1. Specify the Sql id
  2. ~~~~~~~~~~~~~~~~~~
  3. Enter value for sqlid: 6d0b2rq5dj5u9

  4. Sql Id specified: 6d0b2rq5dj5u9
  5. Elapsed: 00:00:00.01

  6. Tune the sql
  7. ~~~~~~~~~~~~
  8. Elapsed: 00:00:00.00
  9. Elapsed: 00:00:39.57

  10. GENERAL INFORMATION SECTION
  11. -------------------------------------------------------------------------------
  12. Tuning Task Name   : TASK_59486
  13. Tuning Task Owner  : SYS
  14. Workload Type      : Single SQL Statement
  15. Scope              : COMPREHENSIVE
  16. Time Limit(seconds): 1800
  17. Completion Status  : COMPLETED
  18. Started at         : 12/16/2013 17:18:30
  19. Completed at       : 12/16/2013 17:19:08

  20. -------------------------------------------------------------------------------
  21. Schema Name: SYS
  22. SQL ID     : 6d0b2rq5dj5u9
  23. SQL Text   : select count(*)
  24.                  from xcxtt_sj_sjjbxx sj
  25.                 inner join xcxtt_sys_organization org
  26.                    on org.orgcode = sj.bldwid
  27.                 where sj.lrrq >= to_date('2013-11-01', 'yyyy-mm-dd
  28.              hh24:mi:ss')
  29.                   and sj.lrrq < to_date('2013-11-30', 'yyyy-mm-dd
  30.              hh24:mi:ss')
  31.                   and org.treepath like '11000000000000.11010600000000' || '%'

  32. -------------------------------------------------------------------------------
  33. FINDINGS SECTION (1 finding)
  34. -------------------------------------------------------------------------------

  35. 1- SQL Profile Finding (see explain plans section below)
  36. --------------------------------------------------------
  37.   A potentially better execution plan was found for this statement.

  38.   Recommendation (estimated benefit: 99.35%)
  39.   ------------------------------------------
  40.   - Consider accepting the recommended SQL profile.
  41.     execute dbms_sqltune.accept_sql_profile(task_name => 'TASK_59486',
  42.             task_owner => 'SYS', replace => TRUE);

  43.   Validation results
  44.   ------------------
  45.   The SQL profile was tested by executing both its plan and the original plan
  46.   and measuring their respective execution statistics. A plan may have been
  47.   only partially executed if the other could be run to completion in less time.

  48.                            Original Plan  With SQL Profile  % Improved
  49.                            -------------  ----------------  ----------
  50.   Completion Status:            COMPLETE          COMPLETE
  51.   Elapsed Time(ms):                 7339                50      99.31%
  52.   CPU Time(ms):                     7430                70      99.05%
  53.   User I/O Time(ms):                   0                 0
  54.   Buffer Gets:                    188731              1209      99.35%
  55.   Disk Reads:                          0                 0
  56.   Direct Writes:                       0                 0
  57.   Rows Processed:                      1                 1
  58.   Fetches:                             1                 1
  59.   Executions:                          1                 1

  60. -------------------------------------------------------------------------------
  61. EXPLAIN PLANS SECTION
  62. -------------------------------------------------------------------------------

  63. 1- Original With Adjusted Cost
  64. ------------------------------
  65. Plan hash value: 2027379502

  66. -----------------------------------------------------------------------------------------------------
  67. | Id  | Operation           | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
  68. -----------------------------------------------------------------------------------------------------
  69. |   0 | SELECT STATEMENT    |                               |     1 |    93 |   316   (0)| 00:00:04 |
  70. |   1 |  SORT AGGREGATE     |                               |     1 |    93 |            |          |
  71. |*  2 |   FILTER            |                               |       |       |            |          |
  72. |   3 |    NESTED LOOPS     |                               | 25658 |  2330K|   316   (0)| 00:00:04 |
  73. |*  4 |     INDEX RANGE SCAN| CIX_SYS_ORGANIZATION_TREECODE |   157 | 10990 |     2   (0)| 00:00:01 |
  74. |*  5 |     INDEX RANGE SCAN| INDEX_SJ_SJJBXX_RQDW          |   442 | 10166 |     2   (0)| 00:00:01 |
  75. -----------------------------------------------------------------------------------------------------

  76. Predicate Information (identified by operation id):
  77. ---------------------------------------------------

  78.    2 - filter(TO_DATE('2013-11-01','yyyy-mm-dd hh24:mi:ss')<TO_DATE('2013-11-30','yyyy-mm-dd
  79.               hh24:mi:ss'))
  80.    4 - access("ORG"."TREEPATH" LIKE '11000000000000.11010600000000%')
  81.        filter("ORG"."TREEPATH" LIKE '11000000000000.11010600000000%')
  82.    5 - access("SJ"."LRRQ">=TO_DATE('2013-11-01','yyyy-mm-dd hh24:mi:ss') AND
  83.               "ORG"."ORGCODE"="SJ"."BLDWID" AND "SJ"."LRRQ"<TO_DATE('2013-11-30','yyyy-mm-dd hh24:mi:ss'))
  84.        filter("ORG"."ORGCODE"="SJ"."BLDWID")

  85. 2- Original With Adjusted Cost
  86. ------------------------------
  87. Plan hash value: 2027379502

  88. -----------------------------------------------------------------------------------------------------
  89. | Id  | Operation           | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
  90. -----------------------------------------------------------------------------------------------------
  91. |   0 | SELECT STATEMENT    |                               |     1 |    93 |   316   (0)| 00:00:04 |
  92. |   1 |  SORT AGGREGATE     |                               |     1 |    93 |            |          |
  93. |*  2 |   FILTER            |                               |       |       |            |          |
  94. |   3 |    NESTED LOOPS     |                               | 25658 |  2330K|   316   (0)| 00:00:04 |
  95. |*  4 |     INDEX RANGE SCAN| CIX_SYS_ORGANIZATION_TREECODE |   157 | 10990 |     2   (0)| 00:00:01 |
  96. |*  5 |     INDEX RANGE SCAN| INDEX_SJ_SJJBXX_RQDW          |   442 | 10166 |     2   (0)| 00:00:01 |
  97. -----------------------------------------------------------------------------------------------------

  98. Predicate Information (identified by operation id):
  99. ---------------------------------------------------

  100.    2 - filter(TO_DATE('2013-11-01','yyyy-mm-dd hh24:mi:ss')<TO_DATE('2013-11-30','yyyy-mm-dd
  101.               hh24:mi:ss'))
  102.    4 - access("ORG"."TREEPATH" LIKE '11000000000000.11010600000000%')
  103.        filter("ORG"."TREEPATH" LIKE '11000000000000.11010600000000%')
  104.    5 - access("SJ"."LRRQ">=TO_DATE('2013-11-01','yyyy-mm-dd hh24:mi:ss') AND
  105.               "ORG"."ORGCODE"="SJ"."BLDWID" AND "SJ"."LRRQ"<TO_DATE('2013-11-30','yyyy-mm-dd hh24:mi:ss'))
  106.        filter("ORG"."ORGCODE"="SJ"."BLDWID")

  107. 3- Using SQL Profile
  108. --------------------
  109. Plan hash value: 2716384415

  110. -----------------------------------------------------------------------------------------------------
  111. | Id  | Operation           | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
  112. -----------------------------------------------------------------------------------------------------
  113. |   0 | SELECT STATEMENT    |                               |     1 |    93 |     8  (38)| 00:00:01 |
  114. |   1 |  SORT AGGREGATE     |                               |     1 |    93 |            |          |
  115. |*  2 |   FILTER            |                               |       |       |            |          |
  116. |*  3 |    HASH JOIN        |                               | 25658 |  2330K|     8  (38)| 00:00:01 |
  117. |*  4 |     INDEX RANGE SCAN| CIX_SYS_ORGANIZATION_TREECODE |   157 | 10990 |     2   (0)| 00:00:01 |
  118. |*  5 |     INDEX RANGE SCAN| INDEX_SJ_SJJBXX_RQDW          |   258K|  5804K|     3   (0)| 00:00:01 |
  119. -----------------------------------------------------------------------------------------------------

  120. Predicate Information (identified by operation id):
  121. ---------------------------------------------------

  122.    2 - filter(TO_DATE('2013-11-01','yyyy-mm-dd hh24:mi:ss')<TO_DATE('2013-11-30','yyyy-mm-dd
  123.               hh24:mi:ss'))
  124.    3 - access("ORG"."ORGCODE"="SJ"."BLDWID")
  125.    4 - access("ORG"."TREEPATH" LIKE '11000000000000.11010600000000%')
  126.        filter("ORG"."TREEPATH" LIKE '11000000000000.11010600000000%')
  127.    5 - access("SJ"."LRRQ">=TO_DATE('2013-11-01','yyyy-mm-dd hh24:mi:ss') AND
  128.               "SJ"."LRRQ"<TO_DATE('2013-11-30','yyyy-mm-dd hh24:mi:ss'))

  129. -------------------------------------------------------------------------------

  130. Elapsed: 00:00:02.47
  131. Elapsed: 00:00:00.00
复制代码

回复 显示全部楼层 道具 举报

6#
发表于 2013-12-16 17:48:41
本帖最后由 SKYLINE.LIU 于 2013-12-16 17:53 编辑
Liu Maclean(刘相兵 发表于 2013-12-15 19:25
---------------------------------------------------------------------------------------------------- ...


在1楼的列统计信息
  1. TABLE_NAME        COLUMN_NAME        NUM_DISTINCT        NUM_NULLS        NUM_BUCKETS        DENSITY
  2. T_SJ_SJJBXX        BLDWID        575        88460        1        0.00173913043478261
  3. T_SJ_SJJBXX        LRRQ        792962        2020        1        1.26109447867615E-6
  4. T_SYS_ORGANIZATION        ORGCODE        3517        0        1        0.000284333238555587
  5. T_SYS_ORGANIZATION        TREEPATH        3517        0        1        0.000284333238555587
复制代码
作为条件的四个列 TREEPATH,ORGCODE,BLDWID,LRRQ 均没有直方图,所以直方图的影响可以排除。

非常感谢各位专家在百忙之中的解答,这个问题能否解决并不重要,最重要的是向各位专家学习了解决问题的思路~

回复 显示全部楼层 道具 举报

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

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-6-2 23:45 , Processed in 0.054129 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569