在一项新工作中,我必须弄清楚一些数据库报告脚本是如何工作的。 有一张桌子给我带来了一些麻烦。我在现有脚本中看到它是一个分区表。 我的问题是我在这个表上运行的任何查询都返回“没有选择行”。
以下是我在此表中调查的一些细节:
表格大小估算值
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
使用Tabespace
这是一个空间摘要(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的查询都返回“没有选择行”。我究竟做错了什么?我怎样才能知道如何从该表中提取数据?
答案 0 :(得分:1)
我认为其他一些流程可能会删除数据,但如果没有访问您的网站,那么此处任何人都无法判断是否存在这样的数据。
我在帖子中没有看到你提到了分区DATE列的名称,但根据你发布的SQL,我认为它是TRDATE - 如果这不正确,请在下面的语句中更改TRDATE为分区栏。
那说,试一试:
SELECT COUNT(*)
FROM PPREC
WHERE TRDATE >= TO_DATE('01-SEP-2012 00:00:00', 'DD-MON-YYYY HH24:MI:SS')
这假设您应该从9月开始在此表中包含数据。如果您找到数据,那很好。如果你不这样做 - 好吧,回到今天(当男人是男人,女人是女人,电脑是水冷的:-)我们对IBM大型机的内存有一点说法:
1. If you can see it, and it's there, it's Real.
2. If you can't see it, but it's there, it's Protected.
3. If you can see it, but it's not there, it's Virtual.
4. If you can't see it, and it's not there, it's GONE!
: - )
对于遇到性能问题的情况,应保留PARTITION子句的使用(注意:不允许猜测是什么或不会出现性能问题。直到遇到性能问题为止没有性能问题。多年来我发现软件在最困难的地方花费了大量的执行时间:-),并且通常的修复(添加索引,删除不必要的数据,人为牺牲等)没有工作。基本上,正常编写查询并信任数据库以使其正确。 (在一般情况下 - 始终编写最简单的代码 - 并做最简单的事情 - 这可能会有效。99%以上的时间它会没问题。这可以让你花费你的优化时间少于百分之一的情况,其中简单不够好 - 并且大多数您编写或设计的软件将简单易懂。
分享并享受。