`
fuqiangjava
  • 浏览: 12594 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

oracle表分区

阅读更多
打算写一系列的文章介绍11g的新特性和变化。
Oracle11g在分区方面做了很大的提高,不但新增了4种复合分区类型,还增加了虚拟列分区、系统分区、INTERVAL分区等功能。
这一篇介绍Oracle11g的虚拟列分区功能。
Oracle11新特性——分区功能增强(一):http://yangtingkun.itpub.net/post/468/403962
Oracle11新特性——分区功能增强(二):http://yangtingkun.itpub.net/post/468/404223
Oracle11新特性——分区功能增强(三):http://yangtingkun.itpub.net/post/468/404694



Oracle11g新增了虚拟列功能,虚拟列的值从其他的列推导而来,Oracle只保存源数据,这个列不占存储空间。虚拟列其中一个引申功能就是虚拟列分区功能。
关于虚拟列的详细描述,可以参考:http://yangtingkun.itpub.net/post/468/409211
11g增加对虚拟列的支持,这使得分区功能更加灵活。
举一个简单的例子,表中有一个日期列,希望根据日期列进行分区,每个月份一个分区,一年12个分区。这样无论就可以循环使用这些分区。
具体例子如下:
SQL> CREATE TABLE T_PARTITION_MONTH 
2 (ID NUMBER, NAME VARCHAR2(30), CREATE_DATE DATE)
3 PARTITION BY LIST (TO_NUMBER(TO_CHAR(CREATE_DATE, 'MM')))
4 (
5 PARTITION P1 VALUES (1), 
6 PARTITION P2 VALUES (2), 
7 PARTITION P3 VALUES (3), 
8 PARTITION P4 VALUES (4), 
9 PARTITION P5 VALUES (5), 
10 PARTITION P6 VALUES (6), 
11 PARTITION P7 VALUES (7), 
12 PARTITION P8 VALUES (8), 
13 PARTITION P9 VALUES (9), 
14 PARTITION P10 VALUES (10), 
15 PARTITION P11 VALUES (11), 
16 PARTITION P12 VALUES (12)
17 );
PARTITION BY LIST (TO_NUMBER(TO_CHAR(CREATE_DATE, 'MM')))
*第 3 行出现错误:
ORA-00907: 缺失右括号
无论是采用范围分区,还是列表分区,都要面临分区列是一个函数表达式的问题。在11g以前,解决的唯一方法是人为添加一个列,取值为TO_NUMBER(TO_CHAR(CREATE_DATE), ‘MM’)),然而这种方法对程序影响比较大,而且会增加额外的存储开销。
在11g中,可以使用虚拟列分区来解决这个问题:
SQL> CREATE TABLE T_PARTITION_MONTH 
2 (
3 ID NUMBER, 
4 NAME VARCHAR2(30), 
5 CREATE_DATE DATE, 
6 PARTITION_MONTH AS (TO_NUMBER(TO_CHAR(CREATE_DATE, 'MM')))
7 )
8 PARTITION BY LIST (PARTITION_MONTH)
9 (
10 PARTITION P1 VALUES (1), 
11 PARTITION P2 VALUES (2), 
12 PARTITION P3 VALUES (3), 
13 PARTITION P4 VALUES (4), 
14 PARTITION P5 VALUES (5), 
15 PARTITION P6 VALUES (6), 
16 PARTITION P7 VALUES (7), 
17 PARTITION P8 VALUES (8), 
18 PARTITION P9 VALUES (9), 
19 PARTITION P10 VALUES (10), 
20 PARTITION P11 VALUES (11), 
21 PARTITION P12 VALUES (12)
22 );
表已创建。
SQL> SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'T_PARTITION_MONTH';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
T_PARTITION_MONTH P1
T_PARTITION_MONTH P2
T_PARTITION_MONTH P3
T_PARTITION_MONTH P4
T_PARTITION_MONTH P5
T_PARTITION_MONTH P6
T_PARTITION_MONTH P7
T_PARTITION_MONTH P8
T_PARTITION_MONTH P9
T_PARTITION_MONTH P10
T_PARTITION_MONTH P11
T_PARTITION_MONTH P12
已选择12行。
建立分区后,虚拟列的定义就不能在进行修改了:
SQL> ALTER TABLE T_PARTITION_MONTH 
2 MODIFY PARTITION_MONTH AS (ROUND(TO_NUMBER(TO_CHAR(CREATE_DATE, 'MM'))));
MODIFY PARTITION_MONTH AS (ROUND(TO_NUMBER(TO_CHAR(CREATE_DATE, 'MM'))))
*第 2 行出现错误:
ORA-54019: 无法更改虚拟列表达式, 因为它是分区列
而且虚拟列分区只支持系统函数,不支持用户定义的函数:
SQL> CREATE OR REPLACE FUNCTION F_TEST (P_IN IN NUMBER) RETURN NUMBER DETERMINISTIC AS
2 BEGIN
3 RETURN 1;
4 END;
5 /
函数已创建。
SQL> CREATE TABLE T_PARTITION_VIRTUAL
2 (
3 ID NUMBER, 
4 NAME VARCHAR2(30), 
5 V_ID AS (F_TEST(ID))
6 )
7 PARTITION BY HASH(V_ID) PARTITIONS 4;
V_ID AS (F_TEST(ID))
*第 5 行出现错误:
ORA-54021: 不能在分区列或子分区列中使用 PL/SQL 表达式
其实不止是用户自定义的函数,所有非STANDARD包中的函数都是不能用作虚拟分区列的:
SQL> CREATE TABLE T_PARTITION_VIRTUAL
2 (
3 ID NUMBER, 
4 NAME VARCHAR2(30), 
5 V_ID AS (DBMS_UTILITY.GET_HASH_VALUE(NAME, 1, 65536))
6 )
7 PARTITION BY HASH(V_ID) PARTITIONS 4;
V_ID AS (DBMS_UTILITY.GET_HASH_VALUE(NAME, 1, 65536))
*第 5 行出现错误:
ORA-54021: 不能在分区列或子分区列中使用 PL/SQL 表达式

=============================================================



-- Create table
--表T_IISS_LOG_COMMONUSERLOG
create table T_IISS_LOG_COMMONUSERLOG
(
  GID        NUMBER(38) not null,
  LOGDATE    VARCHAR2(30) not null,
  OFFDATE    VARCHAR2(30),
  USERID     VARCHAR2(38) not null,
  USERTOKEN  VARCHAR2(64) not null,
  CLIENTCODE VARCHAR2(30),
  PORTALTYPE NUMBER(4),
  AREACODE   VARCHAR2(30),
  IP         VARCHAR2(30),
  LOGINIPADDR VARCHAR2(30),
  CLIENTVERSION VARCHAR2(32),
  GWUA VARCHAR2(512),
  PAGEAREACODE VARCHAR2(32),
  LOGINTYPE VARCHAR2(4),
  GATEWAY VARCHAR2(4),
  ENTERDATE    DATE default sysdate,
  PARTITION_MONTH AS (to_number(to_char(ENTERDATE,'MM')))
)
PARTITION BY LIST (PARTITION_MONTH)
(
  PARTITION COMMONUSERLOG_PAR_01 VALUES (1),
  PARTITION COMMONUSERLOG_PAR_02 VALUES (2),
  PARTITION COMMONUSERLOG_PAR_03 VALUES (3),
  PARTITION COMMONUSERLOG_PAR_04 VALUES (4),
  PARTITION COMMONUSERLOG_PAR_05 VALUES (5),
  PARTITION COMMONUSERLOG_PAR_06 VALUES (6),
  PARTITION COMMONUSERLOG_PAR_07 VALUES (7),
  PARTITION COMMONUSERLOG_PAR_08 VALUES (8),
  PARTITION COMMONUSERLOG_PAR_09 VALUES (9),
  PARTITION COMMONUSERLOG_PAR_10 VALUES (10),
  PARTITION COMMONUSERLOG_PAR_11 VALUES (11),
  PARTITION COMMONUSERLOG_PAR_12 VALUES (12)
)
tablespace IISS_LOG_DAT;

comment on column T_IISS_LOG_COMMONUSERLOG.GID
  is '日志ID(由单独的序列生成)';
comment on column T_IISS_LOG_COMMONUSERLOG.LOGDATE
  is '上线时间';
comment on column T_IISS_LOG_COMMONUSERLOG.OFFDATE
  is '下线时间';
comment on column T_IISS_LOG_COMMONUSERLOG.USERID
  is '用户ID';
comment on column T_IISS_LOG_COMMONUSERLOG.USERTOKEN
  is 'token';
comment on column T_IISS_LOG_COMMONUSERLOG.CLIENTCODE
  is '终端软件编码';
comment on column T_IISS_LOG_COMMONUSERLOG.PORTALTYPE
  is '访问类型0:web;1:wap;2:client';
comment on column T_IISS_LOG_COMMONUSERLOG.AREACODE
  is '区域编码';
comment on column T_IISS_LOG_COMMONUSERLOG.IP
  is '登录系统IP地址';
comment on column T_IISS_LOG_COMMONUSERLOG.LOGINIPADDR
  is '登录系统IP地址(广东用)';
comment on column T_IISS_LOG_COMMONUSERLOG.CLIENTVERSION
  is '客户端版本(广东用)';
comment on column T_IISS_LOG_COMMONUSERLOG.GWUA
  is '终端型号,长UA字符串(广东用)';
comment on column T_IISS_LOG_COMMONUSERLOG.pageareacode
  is '登录页面归属地市编码';
comment on column T_IISS_LOG_COMMONUSERLOG.LoginType
  is '0 无线城市帐号(注册时管理模块返回的Userid)
1 网厅帐号(北京使用)
2 手机号码
3 用户自定义ID(昵称)
4 邮箱登录
默认是0';
comment on column T_IISS_LOG_COMMONUSERLOG.Gateway
  is '01-CMWAP 02-CMNET 03-电信 04-联通 05-其他';
  --start add bu fuqiang
  comment on column T_IISS_LOG_COMMONUSERLOG.ENTERDATE
  is '日志入库时间 默认是sysdate';
  comment on column T_IISS_LOG_COMMONUSERLOG.PARTITION_MONTH
  is 'oracle11G的虚拟列 不可以修改';
   --end add bu fuqiang
 
create index IX_IISS_LOG_COMMONUSERLOG_DATE on T_IISS_LOG_COMMONUSERLOG (LOGDATE)
  tablespace IISS_LOG_IDX;
 
create index IX_IISS_LOG_COMUSERLOG_LOGID on T_IISS_LOG_COMMONUSERLOG (USERID)
  tablespace IISS_LOG_IDX;
 
create index I_IISS_LOG_COMMONUSERLOG_TOKEN on t_iiss_log_commonuserlog (USERTOKEN)
  tablespace IISS_LOG_IDX;
分享到:
评论

相关推荐

    oracle表分区详解

    - 分区表的管理可能比非分区表复杂,尤其是当涉及到大量分区时。 - 对于频繁更改分区键的场景,分区表的维护成本较高。 #### 四、分区类型及示例 ##### 1. 范围分区 范围分区是根据一个列的值的范围来决定数据存储...

    Oracle表分区 建表空间 创建用户

    ### Oracle表分区、建表空间与用户管理 #### 一、表空间的创建与管理 在Oracle数据库中,**表空间**(Tablespace)是物理存储的逻辑容器,它由一个或多个数据文件组成。创建一个新的表空间对于数据库的管理非常重要...

    Oracle表分区详解

    在实际应用中,还需要关注分区表的索引、物化视图、分区维护操作(如添加、合并和拆分分区)等方面,以确保系统性能和可维护性。 总结来说,Oracle表分区是大型数据库系统中的重要优化手段,通过合理规划和应用,...

    Oracle表分区详解(优缺点)

    已存在的非分区表无法直接转化为分区表,需要通过特定的在线重定义操作来完成。此外,分区会增加数据库的复杂性,可能需要更多的存储空间,并且对数据库设计和维护提出了更高要求。 Oracle表分区主要有以下几种类型...

    利用kettle自动创建oracle表分区

    在创建Oracle表分区之前,需要先创建一个分区表实例。创建分区表实例的SQL语句如下: ``` create table DE_TEST( name_tag varchar2(10), day_tag DATE) PARTITION BY RANGE (day_tag) ( PARTITION DE_TEST_...

    oracle表分区详细讲解

    - 已经存在的表不能直接转化为分区表,但Oracle提供了在线重定义功能。 #### 四、表分区的类型及操作方法 1. **范围分区**:最常用的分区类型之一,根据分区键的范围将数据映射到各个分区。通常使用日期作为分区键...

    oracle表分区实例

    Oracle数据库中的表分区是一种优化大型数据表性能的技术,它将一个大表划分为多个更小、更易管理的部分,每个部分称为一个分区。通过分区,可以提高查询速度、简化管理和维护,以及改善备份和恢复的效率。以下是...

    ORACLE表分区例子

    在下载的“oracle表分区”压缩包中,可能包含了演示如何在Oracle环境中创建、操作和管理分区表的SQL脚本和文档。通过学习和实践这些示例,你可以深入理解并掌握Oracle表分区技术,从而更好地应对大数据量的挑战。

    ORACLE表分区指引

    - 分区表和索引:大型表和索引可以被进一步划分为更小、更容易管理的部分。比如,Table T1 和 Index I1 可以被分割成多个分区。 分区带来的好处包括: - 表可用性:分区可以让每个分区独立管理,备份和恢复操作...

    oracle表分区详解【转】

    Oracle数据库中的表分区是数据库设计中的一个重要概念,它允许我们将大型数据表划分为较小、更易管理和查询的部分。本文将深入探讨Oracle表分区的详细知识,包括其原理、类型、优势以及如何在实际操作中应用。 一、...

    oracle表分区详解.pdf

    总之,Oracle表分区是一项强大的数据库管理技术,它在处理大规模数据时提供了许多优势,但也需要数据库管理员掌握相关的知识和技能来有效管理分区表。随着数据量的不断增长,合理利用分区策略可以帮助企业节省维护...

    oracle表分区知识

    - **维护和管理**:分区表的维护和备份恢复可能更复杂,需要考虑如何处理跨分区的操作,以及如何有效地执行分区级别的DML操作。 - **性能监控**:分区后,数据库管理员需要持续监控分区性能,适时调整分区策略,如...

    oracle表分区.[归类].pdf

    本篇将详细介绍Oracle分区的原理、优缺点以及各种分区方法,并提供相关操作示例。 一、Oracle分区简介 Oracle分区的核心理念是“分而治之”,它将大表和索引分成多个小的逻辑单元,称为分区。这种技术有助于减少...

    Oracle表分区技术总结.doc

    Oracle表分区技术是一种高效管理大型数据库表的策略,它通过将大表划分为较小的、独立的分区,提高数据管理的便捷性和性能。这一技术自Oracle8开始引入,旨在应对数据量急剧增长带来的挑战。 首先,分区技术的核心...

    Oracle 表分区

    - 已存在的非分区表转换成分区表较为复杂,Oracle提供在线重定义功能解决这一问题。 - 需要更多的存储空间,因为每个分区都是独立的表空间。 - 设计和管理分区需要专业知识,增加了数据库设计的复杂性。 4. **表...

    oracle表分区精讲

    - 已经存在的表不能直接转换为分区表,但Oracle提供在线重定义表的功能,可以在一定程度上解决这一问题。 #### 四、表分区的几种类型及操作方法 - **范围分区**:根据特定的范围将数据分配到各个分区。最常见的...

Global site tag (gtag.js) - Google Analytics