1

在一份新工作中,我必须弄清楚一些数据库报告脚本是如何工作的。有一张桌子给我带来了一些麻烦。我在现有脚本中看到它是一个分区表。我的问题是我在这个表上运行的任何查询都会返回“未选择行”。

以下是有关我在此表中的调查的一些详细信息:

表大小估计

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 的查询都返回“未选择行”。我究竟做错了什么?我怎样才能知道如何从这个表中提取数据?

4

1 回答 1

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% 以上的时间会没事的。这使您可以将优化时间花在简单不够好的不到 1% 的情况上——而且您编写或设计的大多数软件都将简单易懂)。

分享和享受。

于 2012-09-12T11:40:21.113 回答