0

我必须创建一个包含两百个分区的范围分区表。例如:

CREATE TABLE emp (
     empno NUMBER(4), 
     ename VARCHAR2(30), 
     sal   NUMBER
) 
PARTITION BY RANGE(empno) (
partition e1 values less than (1000)     , 
partition e2 values less than (2000)     , 
...
partition e200 values less than (MAXVALUE) 

);

有没有一种方法可以指定范围间隔而不写两百行来指定范围?

4

2 回答 2

3
CREATE TABLE emp (
     empno NUMBER(4), 
     ename VARCHAR2(30), 
     sal   NUMBER
) 
PARTITION BY RANGE(empno) (
partition e1 values less than (1000));

begin
  for k in 2..200 
  loop
     execute immediate 
       'alter table emp add partition e'||k||' values less than  ('||k*1000||')';
  end loop
end;

更新:在 11g 中存在指定范围分区间隔的功能,当您插入表时将创建分区。

但我不喜欢它,也不推荐它,原因有两个:

1 您应该始终保留第一个分区,因为是参考。如果你试图放弃它,你会得到SQL Error: ORA-14758: Last partition in the range section cannot be dropped

2 您无法控制分区名称(AFAIK)和间隔(这很难看)。如果您在将来错误地插入了一个值,则某些分区将被跳过,您将得到胖分区:( 研究了一点,没有胖分区。添加到示例中。)

 Create table Z_TB_PART_TEST(
    id number
  )
  partition by range(id)
  interval(1000)
 (
    PARTITION PART_01 VALUES LESS THAN (1000)
 );  

 INSERT INTO Z_TB_PART_TEST values (1500);
 INSERT INTO Z_TB_PART_TEST VALUES (10000);
 INSERT INTO Z_TB_PART_TEST VALUES (5000);


  SELECT partition_name , high_value
  FROM USER_TAB_PARTITIONS
  WHERE table_name = 'Z_TB_PART_TEST';

  PART_01   1000
  SYS_P141  2000
  SYS_P142  11000
  SYS_P143  6000

UPDATE2:Nicholas Krasnov 在评论中指出了第一点的解决方法:

ORA-14758 怎么样?很容易避免:我们暂时将区间分区表转换为范围分区表(alter table tb_table_test set interval()),删除分区,然后切换回区间分区表(alter table tb_part_test set interval(1000))。

它有效,我已经测试过了。但是应该注意,所有分区都会冻结,它们将是范围分区。如果您有间隙,则将保留(间隙中不会添加分区)。因此,参考分区将是更改为interval. 这就是错误所说的:Last partition in the range section cannot be dropped

因此,您将获得一段范围分区和一段区间分区及其所有优点。

于 2012-10-31T07:35:32.527 回答
3

您没有说您使用的是什么版本的 Oracle,但如果您的 Oracle 版本是 11g,那么有语句INTERVAL子句CREATE TABLE允许您为表建立间隔分区。这是一个例子:

SQL> Create table TB_PART_TEST(
  2    id number
  3  )
  4  partition by range(id)
  5  interval(1000)
  6  (
  7    partition Part_01 values less than (1000)
  8  );  

 table created

 SQL> select partition_name
   2       , high_value
   3    from user_tab_partitions
   4   where table_name = 'TB_PART_TEST';



PARTITION_NAME  HIGH_VALUE
 ------------------------------
  PART_01           1000 


  SQL> insert into TB_PART_TEST(id)
    2    values(1500); 

  1 row created

  SQL> commit;

  commit complete

  SQL> select partition_name
   2       , high_value
   3    from user_tab_partitions
   4   where table_name = 'TB_PART_TEST';

  PARTITION_NAME  HIGH_VALUE
 ------------------------------
  PART_01           1000 
  SYS_P63           2000
于 2012-10-31T08:37:29.960 回答