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

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

0

积分

1

好友

6

主题
1#
发表于 2013-12-11 20:11:19 | 查看: 5942| 回复: 14
本帖最后由 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, 下载次数: 563

默认NL执行计划.txt

2.5 KB, 下载次数: 532

sqlhc_nl.html

34.68 KB, 下载次数: 531

sqlhc_hash_join.html

23.1 KB, 下载次数: 524

TRACE文件.rar

38.92 KB, 下载次数: 1350

2#
发表于 2013-12-11 20:54:18
select count(*) from  xcxt.t_sys_organization  org
where org.treepath like '11000000000000.11010600000000' || '%';


select count(*)
from xcxt.t_sj_sjjbxx sj
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');


给出这2个查询

回复 只看该作者 道具 举报

3#
发表于 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, 下载次数: 1106

sjxx.trc.txt

256 KB, 下载次数: 522

回复 只看该作者 道具 举报

4#
发表于 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方式,开发一般不会同意。

期待各位专家支招~

回复 只看该作者 道具 举报

5#
发表于 2013-12-13 13:07:20

1        T_SJ_SJJBXX        ZFBA        5170580        258529        29-OCT-13 15:47:20        9        1400448        22        0        232555
2        T_SYS_ORGANIZATION        ZFBA        3517        3517        14-SEP-13 12:11:24        5        3518        32        0        2016



14-SEP-13 12:11:24  这个是统计信息时间吧,会不会太旧?

回复 只看该作者 道具 举报

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

回复 只看该作者 道具 举报

7#
发表于 2013-12-15 19:25:43
-----------------------------------------------------------------------------------------------------
| Id  | Operation           | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                               |     1 |    93 |     4   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE     |                               |     1 |    93 |            |          |
|*  2 |   FILTER            |                               |       |       |            |          |
|   3 |    NESTED LOOPS     |                               |     1 |    93 |     4   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN| CIX_SYS_ORGANIZATION_TREECODE |     1 |    70 |     2   (0)| 00:00:01 |
|*  5 |     INDEX RANGE SCAN| INDEX_SJ_SJJBXX_RQDW          |     1 |    23 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------


   4 - access("ORG"."TREEPATH" LIKE '11000000000000.11010600000000%')
       filter("ORG"."TREEPATH" LIKE '11000000000000.11010600000000%')



id=4的步骤影响  NL 的循环次数,CBO认为返回1条记录, 所以成本很低

'11000000000000.11010600000000'

==》虽然只有30位但是可能导致 直方图在使用时 评估不准确

对于此问题 考虑用SQL PROFILE吧

set linesize 200 pagesize 2000
@?/rdbms/admin/sqltrpt
输入 SQL_ID

并给出结果

回复 只看该作者 道具 举报

8#
发表于 2013-12-16 14:36:36
假如把该列直方图的信息删掉,执行计划会是什么样子呢? 会走HASH_JOIN??

回复 只看该作者 道具 举报

9#
发表于 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
复制代码

回复 只看该作者 道具 举报

10#
发表于 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 均没有直方图,所以直方图的影响可以排除。

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

回复 只看该作者 道具 举报

11#
发表于 2013-12-16 18:11:09
execute dbms_sqltune.accept_sql_profile(task_name => 'TASK_59486', task_owner => 'SYS', replace => TRUE);

接受即可

回复 只看该作者 道具 举报

12#
发表于 2014-8-29 10:42:50
刘大,工作中遇到了类似的问题,通过搜索找到了这个帖子,特来请教。
本例中,当条件 org.treepath like '11000000000000.11010600000000' || '%'换了输入参数值,返回的记录数非常少,比方说只有1条;而sj.lrrq 的时间跨度较大,此时是不是走NESTED LOOPS 较好??采用了accept_sql_profile固定执行计划能否做到准确的选择NESTED LOOPS 与hash join??

回复 只看该作者 道具 举报

13#
发表于 2014-8-29 10:50:32
针对本例,我的理解是 org.treepath为长字符串,此时,不论是否通过直方图oracle均不能准确的估算org.treepath like '11000000000000.11010600000000' || '%的返回记录数,但是这个记录数对于选择nested loops,hash join是至关重要的。这样的情况该如处理? dbms_sqltune.accept_sql_profile能够解决这类问题吗?

回复 只看该作者 道具 举报

14#
发表于 2014-8-29 15:15:38
dbms_sqltune.accept_sql_profile 这个是固定执行计划的,不能解决
'11000000000000.11010600000000' || '% ---这种只关心前面的,是否可以考虑函数索引

回复 只看该作者 道具 举报

15#
发表于 2014-8-29 16:16:39
函数索引?建立什么样的函数索引能较准确的估算返回的记录数?

回复 只看该作者 道具 举报

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

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

GMT+8, 2024-5-20 00:14 , Processed in 0.057042 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

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