暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 虚拟列分区

askTom 2015-09-22
89

问题描述

我有一个具有以下数据结构的表

事件时间戳VARCHAR(100)

其中数据如下所示:

2015-09-22 07:48:54.314

在此基础上,我创建了一个基于日期的虚拟列,该列只从EKE_SITAMP字段中取出日期:

生成的EVEY_DET_DTE始终为( TO_D (SUBSTR(Event_TAMP, 1, 11 ) ,'YYY-MM-DD')虚拟,

此操作正常,在从虚拟列中选择时,我得到以下信息:

事件日期
---------
22-AUG-15

但是,当我检查下面的分区时,即使在插入数据之后,也看不到它们中的任何行。

partition by range (事件日期) interval (numtoyminterval(1, 'month')) (
分区P0值小于( date'2015-09-01')
);

表名称分区名称高值NUM_行
--------------------------------------------------------------------------------------------------------
WMB_MSGS_TEST之前_SEPT TO_D ('2015-09-01 00:00:00','SYYY-M
M-DD HH24:MI:SS','NLS_CAENDAR=GRGORI

WMB_MSGS_TEST SYS_P44 TO_D ('2015-10-01 00:00:00','SYYY-M
M-DD HH24:MI:SS','NLS_CAENDAR=GRGORI

你知道为什么会这样吗?这是否与从ELE_TAMP字段中进行日期转换有关?

我们也有一个要求,自动删除旧分区在每月的第一天,有一个好的方法做到这一点吗?

谢谢

专家解答

你计算过表上的数据了吗?只有在具有统计信息时,才会填充Num_rows :

create table t (
  x date 
) partition by range (x) interval (numtoyminterval(1, 'month')) (
  partition P0 values less than (date'2015-09-01')
);

insert into t 
  select date'2015-08-01'+rownum from dual
  connect by level <= 100;
  
select partition_name, high_value, num_rows from user_tab_partitions
where  table_name = 'T';

PARTITION_ HIGH_VALUE                                                                         NUM_ROWS
---------- -------------------------------------------------------------------------------- ----------
P0         TO_DATE(' 2015-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA           
SYS_P4621  TO_DATE(' 2015-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA           
SYS_P4622  TO_DATE(' 2015-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA           
SYS_P4623  TO_DATE(' 2015-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA           

exec dbms_stats.gather_table_stats(user, 't');

select partition_name, high_value, num_rows from user_tab_partitions
where  table_name = 'T';

PARTITION_ HIGH_VALUE                                                                         NUM_ROWS
---------- -------------------------------------------------------------------------------- ----------
P0         TO_DATE(' 2015-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA         30
SYS_P4621  TO_DATE(' 2015-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA         30
SYS_P4622  TO_DATE(' 2015-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA         31
SYS_P4623  TO_DATE(' 2015-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA          9


要查找每个分区中的当前行数,请使用以下查询:

col subobject_name format a10
select uo.subobject_name, count(*)
from   t, user_objects uo
where  dbms_rowid.rowid_object(t.rowid) = uo.object_id
group  by uo.subobject_name;

SUBOBJECT_   COUNT(*)
---------- ----------
SYS_P4621          30
P0                 30
SYS_P4622          31
SYS_P4623           9


要删除旧分区,您需要构建一个例程来标识分区和问题:

alter table t drop partition ;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论