【问题标题】:Oracle 12c - how to partition existing table?Oracle 12c - 如何对现有表进行分区?
【发布时间】:2017-10-16 06:17:15
【问题描述】:

是否可以在不创建辅助表的情况下对 Oracle 中的现有表进行分区?

还是建议先创建一个包含所有分区的第二个表,然后复制第一个表中的所有内容?

我有表't1':

CREATE TABLE t1 (
    id INT NOT NULL,
    accountnumber VARCHAR NOT NULL,
    yr_qtr INT NOT NULL
)

yr_qtr 有 15 个不同的值。

我想根据 int 的 yr_qtr 对表“t1”进行分区(或使用 yr_qtr 分区创建“t2”)。

【问题讨论】:

  • 你能试试这个吗:ALTER TABLE t1 MODIFY PARTITION BY RANGE (yr_qtr) INTERVAL (1) ( PARTITION P1 VALUES LESS THAN (2) /*add as per requirement (15 as you said) */ ) ONLINE;
  • 此外,yr_qtr 数字将随着时间的推移而不断增长。所以可能需要某种“自动”分区。目前这些是 yr_qtr 的值:20141, 20142, 20143, 20144, 20141, 20152, 20153, 20154, 20161, 20162, 20163, 20164, 20171, 20172, 20173, 2014 2018 2018 2018 2 ...
  • 已包含 INTERVAL PARTITION。如果有的话,也要注意索引。
  • 试过上面的查询:ALTER TABLE t1 MODIFY PARTITION BY RANGE (yr_qtr) INTERVAL (1) ( PARTITION P1 VALUES LESS THAN (2) ) ONLINE; 错误:ORA-14006: invalid partition name 14006. 00000 - "invalid partition name" *Cause: a partition name of the form <identifier> is expected but not present. *Action: enter an appropriate partition name.
  • 我跑得很好@(Oracle Live SQL)

标签: sql oracle database-design partitioning


【解决方案1】:
drop table t1;


CREATE TABLE t1 (
    id INT NOT NULL,
    accountnumber VARCHAR2(2) NOT NULL,
    yr_qtr INT NOT NULL
);

insert all 
into t1 values(1,'AB',20141)
into t1 values(2,'CD',20142)
into t1 values(3,'EF',20143)
into t1 values(4,'GH',20144)
into t1 values(5,'IJ',20145)
select * from dual;

select * from user_tab_partitions where table_name = 'T1';

select * from t1;

--Creating Partition online
ALTER TABLE t1 
MODIFY PARTITION BY RANGE (yr_qtr) 
INTERVAL (1) ( PARTITION P1 VALUES LESS THAN (20141) ) ONLINE;

select * from t1;

select * from user_tab_partitions where table_name = 'T1';

输出:

Table dropped.
Table created.
5 row(s) inserted.
no data found
Result Set 5

ID  ACCOUNTNUMBER   YR_QTR
1   AB  20141
2   CD  20142
3   EF  20143
4   GH  20144
5   IJ  20145

Download CSV
5 rows selected.
Table altered.
Result Set 6

ID  ACCOUNTNUMBER   YR_QTR
1   AB  20141
2   CD  20142
3   EF  20143
4   GH  20144
5   IJ  20145

Download CSV
5 rows selected.
Result Set 7

TABLE_NAME  COMPOSITE   PARTITION_NAME  SUBPARTITION_COUNT  HIGH_VALUE  HIGH_VALUE_LENGTH   PARTITION_POSITION  TABLESPACE_NAME PCT_FREE    PCT_USED    INI_TRANS   MAX_TRANS   INITIAL_EXTENT  NEXT_EXTENT MIN_EXTENT  MAX_EXTENT  MAX_SIZE    PCT_INCREASE    FREELISTS   FREELIST_GROUPS LOGGING COMPRESSION COMPRESS_FOR    NUM_ROWS    BLOCKS  EMPTY_BLOCKS    AVG_SPACE   CHAIN_CNT   AVG_ROW_LEN SAMPLE_SIZE LAST_ANALYZED   BUFFER_POOL FLASH_CACHE CELL_FLASH_CACHE    GLOBAL_STATS    USER_STATS  IS_NESTED   PARENT_TABLE_PARTITION  INTERVAL    SEGMENT_CREATED INDEXING    READ_ONLY   INMEMORY    INMEMORY_PRIORITY   INMEMORY_DISTRIBUTE INMEMORY_COMPRESSION    INMEMORY_DUPLICATE  CELLMEMORY  INMEMORY_SERVICE    INMEMORY_SERVICE_NAME
T1  NO  P1  0   20141   5   1   LIVESQL_USERS   10   -  1   255 65536   1048576 1   2147483645  2147483645   -   -   -  YES DISABLED     -   -   -   -   -   -   -   -   -  DEFAULT DEFAULT DEFAULT NO  NO  NO   -  NO  YES ON  NO  DISABLED     -   -   -   -   -   -   - 
T1  NO  SYS_P29017  0   20142   5   2   LIVESQL_USERS   10   -  1   255 65536   1048576 1   2147483645  2147483645   -   -   -  YES DISABLED     -   -   -   -   -   -   -   -   -  DEFAULT DEFAULT DEFAULT NO  NO  NO   -  YES YES ON  NO  DISABLED     -   -   -   -   -   -   - 
T1  NO  SYS_P29018  0   20143   5   3   LIVESQL_USERS   10   -  1   255 65536   1048576 1   2147483645  2147483645   -   -   -  YES DISABLED     -   -   -   -   -   -   -   -   -  DEFAULT DEFAULT DEFAULT NO  NO  NO   -  YES YES ON  NO  DISABLED     -   -   -   -   -   -   - 
T1  NO  SYS_P29019  0   20144   5   4   LIVESQL_USERS   10   -  1   255 65536   1048576 1   2147483645  2147483645   -   -   -  YES DISABLED     -   -   -   -   -   -   -   -   -  DEFAULT DEFAULT DEFAULT NO  NO  NO   -  YES YES ON  NO  DISABLED     -   -   -   -   -   -   - 
T1  NO  SYS_P29020  0   20145   5   5   LIVESQL_USERS   10   -  1   255 65536   1048576 1   2147483645  2147483645   -   -   -  YES DISABLED     -   -   -   -   -   -   -   -   -  DEFAULT DEFAULT DEFAULT NO  NO  NO   -  YES YES ON  NO  DISABLED     -   -   -   -   -   -   - 
T1  NO  SYS_P29021  0   20146   5   6   LIVESQL_USERS   10   -  1   255 65536   1048576 1   2147483645  2147483645   -   -   -  YES DISABLED     -   -   -   -   -   -   -   -   -  DEFAULT DEFAULT DEFAULT NO  NO  NO   -  YES YES ON  NO  DISABLED     -   -   -   -   -   -   - 

Download CSV
6 rows selected.

【讨论】:

  • 所有命令都对我有效:--Creating Partition online ALTER TABLE t1 MODIFY PARTITION BY RANGE (yr_qtr) INTERVAL (1) ( PARTITION P1 VALUES LESS THAN (20141) ) ONLINE; 不知道为什么.. 我正在使用Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit
  • 您可以尝试将分区名称设为 random9801 而不是 P1 吗? :P
  • Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0 PL/SQL Release 12.2.0.1.0 - Production 0 CORE 12.2.0.1.0 Production 0 TNS for Linux: Version 12.2.0.1.0 - Production 0 NLSRTL Version 12.2.0.1.0 - Production 0
  • ALTER TABLE t1 MODIFY PARTITION BY RANGE (yr_qtr) INTERVAL (1) ( PARTITION random9802 VALUES LESS THAN (20141) ) ONLINE Error report - ORA-14006: invalid partition name 14006. 00000 - "invalid partition name" *Cause: a partition name of the form <identifier> is expected but not present. *Action: enter an appropriate partition name. 我从哪里跑有关系吗? (目前使用 SQL Developer)。您还需要特定权限来创建分区吗?
  • 您使用的是 12c R1
猜你喜欢
  • 2019-01-10
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
相关资源
最近更新 更多