【发布时间】:2012-09-12 09:08:06
【问题描述】:
在一份新工作中,我必须弄清楚一些数据库报告脚本是如何工作的。 有一张桌子给我带来了一些麻烦。我在现有脚本中看到它是一个分区表。 我的问题是我在这个表上运行的任何查询都会返回“没有选择行”。
以下是我在此表中调查的一些详细信息:
表大小估计
SQL> select sum(bytes)/1024/1024 Megabytes from dba_segments where segment_name = 'PPREC';
MEGABYTES
----------
45.625
分区
日期范围内共有 730 个分区。
SQL> select min(PARTITION_NAME),max(PARTITION_NAME) from dba_segments where segment_name = 'PPREC';
MIN(PARTITION_NAME) MAX(PARTITION_NAME)
------------------------------ ------------------------------
PART20110201 PART20130130
有几个表空间,其中分配了分区
SQL> select tablespace_name, count(partition_name) from dba_segments where segment_name = 'PPREC' group by tablespace_name;
TABLESPACE_NAME COUNT(PARTITION_NAME)
------------------------------ ---------------------
REC_DATA_01 281
REC_DATA_02 48
REC_DATA_03 70
REC_DATA_04 26
REC_DATA_05 44
REC_DATA_06 51
REC_DATA_07 13
REC_DATA_08 48
REC_DATA_09 32
REC_DATA_10 52
REC_DATA_11 35
REC_DATA_12 30
附加查询:
SQL> select * from dba_segments where segment_name='PPREC' and partition_name='PART20120912';
OWNER SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS
----- ------------ -------------- --------------- --------------- ----------- ------------ ----- ------ -------
HIST PPREC PART20120912 TABLE PARTITION REC_DATA_01 13 475315 65536 8 1
INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE FREELISTS FREELIST_GROUPS RELATIVE_FNO BUFFER_POOL
-------------- ----------- ----------- ----------- ------------ --------- --------------- ------------ -----------
65536 1 2147483645 13 DEFAULT
表空间使用
这是一个空间摘要(dba_tablespaces、dba_data_files、dba_segments、dba_free_space 的组合)
TABLESPACE_NAME TOTAL_MEGABYTES USED_MEGABYTES FREE_MEGABYTES
------------------------------ --------------- -------------- --------------
REC_01_INDX 30,700 250 30,449
REC_02_INDX 7,745 7 7,737
REC_03_INDX 22,692 15 22,677
REC_04_INDX 15,768 10 15,758
REC_05_INDX 25,884 16 25,868
REC_06_INDX 27,992 16 27,975
REC_07_INDX 17,600 10 17,590
REC_08_INDX 18,864 11 18,853
REC_09_INDX 19,700 12 19,687
REC_10_INDX 28,716 16 28,699
REC_DATA_01 102,718 561 102,156
REC_DATA_02 24,544 3,140 21,403
REC_DATA_03 72,710 4 72,704
REC_DATA_04 29,191 2 29,188
REC_DATA_05 42,696 3 42,692
REC_DATA_06 52,780 323 52,456
REC_DATA_07 16,536 1 16,534
REC_DATA_08 49,247 3 49,243
REC_DATA_09 30,848 2 30,845
REC_DATA_10 49,620 3 49,616
REC_DATA_11 40,616 2 40,613
REC_DATA_12 184,922 123,435 61,486
表空间使用情况似乎证实了该表不是空的,实际上它的最后一个表空间 (REC_DATA_12) 似乎很忙。
现有脚本
我觉得令人费解的是,有一些 PL/SQL 存储过程似乎可以在该表上工作并从中获取数据。 这种存储过程的一个例子如下:
procedure FIRST_REC as
vpartition varchar2(12);
begin
select 'PART'||To_char(sysdate,'YYYYMMDD') INTO vpartition FROM DUAL;
execute immediate
'MERGE INTO FIRST_REC_temp a
USING (SELECT bno, min(trdate) mintr,max(trdate) maxtr
FROM PPREC PARTITION ('||vpartition||') WHERE route_id IS NOT NULL AND trunc(trdate) <= trunc(sysdate-1)
GROUP BY bno) b
ON (a.bno=b.bno)
when matched then
update set a.last_tr = b.maxtr
when not matched then
insert (a.bno,a.last_tr,a.first_tr)
values (b.bno,b.maxtr,b.mintr)';
commit;
但是,如果我尝试在桌子上手动使用相同的语法,我会得到以下结果:
SQL> select count(*) from PPREC PARTITION (PART20120912);
COUNT(*)
----------
0
我尝试了一些随机分区,但总是得到相同的 0 计数。
总结 - 我看到一个似乎包含数据的表(已用空间、表空间、数据文件) - 表已分区(在 2013 年 1 月结束的 730 天内每天一个分区) - 脚本以某种方式从该表中提取数据
问题 - 我使用 PARTITION 的查询都返回“未选择行”。我究竟做错了什么?我怎样才能知道如何从这个表中提取数据?
【问题讨论】:
-
使用的空间并不是一个很好的指标,表明有行。数据可能会被删除。您如何确定合并确实将数据传输到表 FIRST_REC_temp?您确定 PPREC 与过程中的表相同吗?您可能在另一个架构/实例中。
-
如果 `select * from dba_segments where segment_name = 'PPREC' and partition_name = 'PART20120912' 你会看到什么?另一点是您不应该使用分区子句而是使用 where 子句来查询分区表(应该对程序员透明的分区存在)。
-
确实,数据可能已被删除。这就是我想要弄清楚的,因为我仍然相信那里有一些数据。我已经检查过它确实是正确的架构。
-
感谢弗洛林的评论,我已经编辑了我的问题以包含您提到的查询。我意识到优化器应该负责分区,但它似乎无法正常工作,并且我看到使用 PARTITION 的脚本有些我认为它是必需的,出于某种原因。
-
您在该分区中只分配了一个扩展区,即初始扩展区。可能您从未在该分区中插入过任何东西。
标签: oracle plsql partitioning