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

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

0

积分

1

好友

29

主题
1#
发表于 2013-1-30 10:04:09 | 查看: 4449| 回复: 9
数据库10.2.0.3.0  olap
两种表mtl_material_transactions   mmt(约150列,485万行数据),mtl_transaction_lot_numbers mtln(约150列,150万行数据)
一条select中只包含了两张表的外连接来获取所需信息
  1. select mmt.organization_id,
  2.        mmt.primary_quantity,
  3.        nvl(mtln.transaction_quantity, mmt.primary_quantity) transaction_quantity,
  4.        mmt.TRANSACTION_ACTION_ID,
  5.        mmt.INVENTORY_ITEM_ID,
  6.        mmt.transaction_type_id,
  7.        mtln.lot_number,
  8.        mmt.transaction_id
  9.   from mtl_material_transactions mmt, mtl_transaction_lot_numbers mtln
  10. where mmt.transaction_id = mtln.transaction_id(+)
  11.    and mmt.organization_id = mtln.organization_id(+)
复制代码
备注信息:
  1. select organization_id
  2. from mtl_material_transactions
  3. group by organization_id
复制代码
organization_id
1        137
2        105
3        106
4        107
1        137
2        105
3        106
4        107
  1. select organization_id
  2. from mtl_transaction_lot_numbers
  3. group by organization_id
复制代码
organization_id
1        106
2        107
两张表transaction_id 包含不同值信息较多,两张表上transaction_id 列和organization_id有复合索引无其他索引
问题:对于这样一条语句,是该拆表,还是改分区表(根据organization_id)还是在organization_id列上添加位图索引
10#
发表于 2013-2-17 09:04:45
ebs的开发大多不考虑效率问题,能实现就结束。。。。
兰州要抓紧时间鞭策他们

回复 只看该作者 道具 举报

9#
发表于 2013-1-30 21:30:29
laobu 发表于 2013-1-30 16:44
可以这样考虑:
哈希连接的实际逻辑读,如果远大于两张表的总块数,显然是在连接过程中multipath的开销过高 ...

感谢感谢,我感觉也是,但是数据量不是很大所以就不太想搞在线重定义去换分区表,看看开发能不能改善下语句,谢谢了

回复 只看该作者 道具 举报

8#
发表于 2013-1-30 16:44:25
可以这样考虑:
哈希连接的实际逻辑读,如果远大于两张表的总块数,显然是在连接过程中multipath的开销过高
如果依据关联字段做了分区,哪怕只对其中一张表分区,也可以通过所谓的智能分区连接,来大幅度减少逻辑读
根据不完全测试,两张表分别200万、50万记录,都按hash(transaction_id)分4个区,实际逻辑读降了一个数量级还多些
另外,就本例而言,索引似乎没帮助

回复 只看该作者 道具 举报

7#
发表于 2013-1-30 15:29:56
cargoo 发表于 2013-1-30 14:59
1         
2        ------------------------------------------------------------------------------- ...

您不说真没注意,但是drop table plan_table purge;
能在生产库直接用么...没用过

回复 只看该作者 道具 举报

6#
发表于 2013-1-30 14:59:38

1         
2        --------------------------------------------------------------------------------------------------
3        | Id  | Operation             | Name                        | Rows  | Bytes |TempSpc| Cost (%CPU)|
4        --------------------------------------------------------------------------------------------------
5        |   0 | SELECT STATEMENT      |                             |  4846K|   254M|       | 95757   (1)|
6        |*  1 |  HASH JOIN RIGHT OUTER|                             |  4846K|   254M|    58M| 95757   (1)|
7        |   2 |   TABLE ACCESS FULL   | MTL_TRANSACTION_LOT_NUMBERS |  1498K|    41M|       | 12987   (1)|
8        |   3 |   TABLE ACCESS FULL   | MTL_MATERIAL_TRANSACTIONS   |  4846K|   120M|       | 71034   (1)|
9        --------------------------------------------------------------------------------------------------
10         
11        Predicate Information (identified by operation id):
12        ---------------------------------------------------
13         
14           1 - access("MMT"."TRANSACTION_ID"="MTLN"."TRANSACTION_ID"(+) AND
15                      "MMT"."ORGANIZATION_ID"="MTLN"."ORGANIZATION_ID"(+))
16         
17        Note
18        -----
19           - 'PLAN_TABLE' is old version

这个PLAN_TABLE版本不是当前数据库版本

回复 只看该作者 道具 举报

5#
发表于 2013-1-30 14:47:28
cargoo 发表于 2013-1-30 14:05
请删除PLAN_TABLE,重新生成执行计划

恩...不太明白,什么意思?

回复 只看该作者 道具 举报

4#
发表于 2013-1-30 14:05:07
请删除PLAN_TABLE,重新生成执行计划

回复 只看该作者 道具 举报

3#
发表于 2013-1-30 11:28:54
shunzi 发表于 2013-1-30 10:29
把执行计划贴出来,试试先创建索引,能不能解决问题,你现在这种数据量,做分区表以后维护会比较麻烦,拆表 ...

  1. 1         
  2. 2        --------------------------------------------------------------------------------------------------
  3. 3        | Id  | Operation             | Name                        | Rows  | Bytes |TempSpc| Cost (%CPU)|
  4. 4        --------------------------------------------------------------------------------------------------
  5. 5        |   0 | SELECT STATEMENT      |                             |  4846K|   254M|       | 95757   (1)|
  6. 6        |*  1 |  HASH JOIN RIGHT OUTER|                             |  4846K|   254M|    58M| 95757   (1)|
  7. 7        |   2 |   TABLE ACCESS FULL   | MTL_TRANSACTION_LOT_NUMBERS |  1498K|    41M|       | 12987   (1)|
  8. 8        |   3 |   TABLE ACCESS FULL   | MTL_MATERIAL_TRANSACTIONS   |  4846K|   120M|       | 71034   (1)|
  9. 9        --------------------------------------------------------------------------------------------------
  10. 10         
  11. 11        Predicate Information (identified by operation id):
  12. 12        ---------------------------------------------------
  13. 13         
  14. 14           1 - access("MMT"."TRANSACTION_ID"="MTLN"."TRANSACTION_ID"(+) AND
  15. 15                      "MMT"."ORGANIZATION_ID"="MTLN"."ORGANIZATION_ID"(+))
  16. 16         
  17. 17        Note
  18. 18        -----
  19. 19           - 'PLAN_TABLE' is old version
复制代码
就是说试着在org_id列添加位图索引试试呗

回复 只看该作者 道具 举报

2#
发表于 2013-1-30 10:29:35
把执行计划贴出来,试试先创建索引,能不能解决问题,你现在这种数据量,做分区表以后维护会比较麻烦,拆表也不置于。先试试创建索引吧。

回复 只看该作者 道具 举报

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

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

GMT+8, 2024-12-27 04:13 , Processed in 0.048932 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

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