问题描述
我有一个具有以下数据结构的表
事件时间戳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字段中进行日期转换有关?
我们也有一个要求,自动删除旧分区在每月的第一天,有一个好的方法做到这一点吗?
谢谢
事件时间戳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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




