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

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

42

积分

0

好友

0

主题
1#
发表于 2012-2-2 19:31:11 | 查看: 6013| 回复: 8
某分区表T,按日分区,分区字段为RQ,有个B字段,且建了local索引,但是查询不同的日期段时,有些日期段是用到了B字段的索引,有些没有,查询语句是这么写的:
select * from T where rq>='20111001' and rq<='20111031' and B='abc';  --这个是不走B字段的索引
select * from T where rq>='20110901' and rq<='20110930' and B='abc';   --这个是走B字段的索引

注:这个表,每天的增量数据是400W条左右。

请教下,这可能会是什么原因?
2#
发表于 2012-2-2 19:33:24
请把这2个 SQL的执行计划贴出来

一般直接

set autotrace traceonly exp
select * from T where rq>='20111001' and rq<='20111031' and B='abc';
select * from T where rq>='20110901' and rq<='20110930' and B='abc';

即可

回复 只看该作者 道具 举报

3#
发表于 2012-2-2 19:46:20
SQL> select * from sca.T  where rq='20111101' and rq<='20111131' and B='1647506';

执行计划
----------------------------------------------------------
Plan hash value: 4194570896

-----------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name                    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                         |     1 |   333 | 40989   (1)| 00:08:12 |    |  |
|   1 |  PARTITION LIST SINGLE|                         |     1 |   333 | 40989   (1)| 00:08:12 |   670 |   670 |
|*  2 |   TABLE ACCESS FULL   | T                      |     1 |   333 | 40989   (1)| 00:08:12 |   670 |   670 |
-----------------------------------------------------------------------------------------------------------------

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

   2 - filter("B"='1647506')

SQL> select * from sca.T where rq='20110901' and rq<='20110931' and B='1647506';

执行计划
----------------------------------------------------------
Plan hash value: 3822139776

-------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name                           | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                                |     1 |   330 |     4   (0)| 00:00:01 |       |       |
|   1 |  PARTITION LIST SINGLE             |                                |     1 |   330 |     4   (0)| 00:00:01 |   609 |   609 |
|   2 |   TABLE ACCESS BY LOCAL INDEX ROWID| T        |     1 |   330 |     4   (0)| 00:00:01 |   609 |   609 |
|*  3 |    INDEX RANGE SCAN                | I_T_01 |     1 |       |     3   (0)| 00:00:01 |   609 |   609 |
-------------------------------------------------------------------------------------------------------------------------------------

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

   3 - access("B"='1647506')

SQL>

回复 只看该作者 道具 举报

4#
发表于 2012-2-2 19:55:14
1.

rq='20111101' and rq<='20111131'   这个谓词条件有点无味  

rq='20111101'  必然 rq<='20111131'        

为什么要这样写SQL 语句? 是用工具生成 或 程序拼起来的SQL?

2.   

desc  sca.T


3.

gather 一下 partition 和 index的  statistics

回复 只看该作者 道具 举报

5#
发表于 2012-2-2 20:07:56
晕,这个刚才在做测试,给忘了恢复,是
rq>='20111101' and rq<='20111131'
rq>='20110901' and rq<='20110931'
改成以上的,执行计划跟原来的一样。

SQL> desc sca.t
名称                                                                                                      是否为空? 类型
----------------------------------------------------------------------------------------------------------------- -------- -----
RQ                                                                                                               VARCHAR2(8)
B                                                                                                                     VARCHAR2(20)
ZHLX                                                                                                               CHAR(1)
KHBH                                                                                                               VARCHAR2(20)
JGBH                                                                                                               VARCHAR2(10)
......
(共141个字段,后面的字段绝大部分是 number(18.4))

这个是第三方的数据库,明天再找人gather一下,看下能否解决问题。

忘了说,数据库版本是 Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi

回复 只看该作者 道具 举报

6#
发表于 2012-2-2 20:26:18
若仍有问题, 参照http://www.oracledatabase12g.com ... h-check-script.html 脚本收集该SQL相关信息 后上传

回复 只看该作者 道具 举报

7#
发表于 2012-2-3 15:20:26
找到问题了,原来是第三方开发人员在修复数据时,采用了exchange
ALTER TABLE T EXCHANGE PARTITION P20111111 WITH TABLE t_tmp;

查一下user_ind_partitions
select partition_name, status from user_ind_partitions where index_name = 'IDX_T_B' and partition_name='P20111111 ';
可以看到status为UNUSABLE
在分析某个分区或者索引时,提示ora-01502错误

所以采用了rebuild 索引这个解决方法。
还没执行,表数据有400多G,IDX_T_B索引27G

这么大数据量的情况下rebuild,应该注意哪些问题?

回复 只看该作者 道具 举报

8#
发表于 2012-2-3 15:27:01
几点考虑:

1. 避免锁的问题, rebuild online or offline
2. 数据量较大的情况下 temp表空间是否够用
3.  创建索引的时间窗口是否够长, 是否要优化rebuild操作以加速

时间紧促, 可能回答的不够全面, 欢迎群里的同学补充

回复 只看该作者 道具 举报

9#
发表于 2012-2-3 18:15:36
由于是几个分区的索引失效,所以采用局部分区索引的rebuild
alter index sca.T rebuild partition P20111111;
......

结贴了,谢谢ML的热心帮助。

回复 只看该作者 道具 举报

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

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

GMT+8, 2024-12-23 23:40 , Processed in 0.051601 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

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