这张表中不是存在tablespace字段吗?
可以指定分区的。

解决方案 »

  1.   

    数据库大表的优化:采用蔟表(clustered tables)及蔟索引(Clustered Index) 
    蔟表和蔟索引是oracle所提供的一种技术,其基本思想是将几张具有相同数据项、并且经常性一起使用的表通过共享数据块(data block)的模式存放在一起。各表间的共同字段作为蔟键值(cluster key),数据库在访问数据时,首先找到蔟键值,以此同时获得若干张表的相关数据。蔟表所能带来的好处是可以减少I/O和减少存储空间,其中我更看重前者。采用表分区(partition) 
    表分区技术是在超大型数据库(VLDB)中将大表及其索引通过分区(patition)的形式分割为若干较小、可管理的小块,并且每一分区可进一步划分为更小的子分区(sub partition)。而这种分区对于应用来说是透明的。通过对表进行分区,可以获得以下的好处: 
    1)减少数据损坏的可能性。 
    2)各分区可以独立备份和恢复,增强了数据库的可管理性。 
    3)可以控制分区在硬盘上的分布,以均衡IO,改善了数据库的性能。 
    蔟表与表分区技术的侧重点各有不同,前者侧重于改进关联表间查询的效率,而表分区侧重于大表的可管理性及局部查询的性能。而这两项对于我的系统来说都是极为重要。由于本人技术限制,目前尚不确定两者是否可以同时实现,有那位在这方面有经验的给点指导将不胜感激。  
    在两者无法同时实现的情况下,应依照需实现的功能有所取舍。综合两种模式的优缺点,我认为采用表分区技术较为适用于我们的应用。 
    Oracle的表分区有以下几种类型: 
    1)范围分区:将表按某一字段或若干个字段的取值范围分区。 
    2)hash分区:将表按某一字段的值均匀地分布到若干个指定的分区。 
    3)复合分区:结合了前面两种分区类型的优点,首先通过值范围将表进行分区,然后以hash模式将数据进一步均匀分配至物理存储位置。 
    综合考虑各项因素,以第三种类型最为优越。(本人实在技术有限仅采用了第1种范围分区,因为比较简单,便于管理) 
    优化的具体步骤: 
    1.确定需要优化分区的表: 
    经过对系统数据库表结构和字段,应用程序的分析,现在确定那些大表需要进行分区: 
    如帐户交易明细表acct_detail. 
    2.确定表分区的方法和分区键: 
    分区类型:采用范围分区。 
    分 区 键: 
    按trans_date(交易时间)字段进行范围分区. 
    3.确定分区键的分区范围,及打算分多少分区: 
    如:帐户交易明细表acct_detail. 
    根据字段(trans_date)分成一下分区: 
    1).分区1:09/01/2003    
    2).分区2:10/01/2003    
    3).分区3:11/01/2003    
    4).分区4:12/01/2003    
    5).分区5:01/01/2004  
    6).分区6:02/01/2004  
       该表明显需要在以后增加分区。 
    4.建立分区表空间和分区索引空间 
      1).建立表的各个分区的表空间:  
       1.分区1:crm_detail_200309 
       CREATE TABLESPACE crm_detail_200309  DATAFILE   
       ‘/u1/oradata/orcl/crm_detail_20030901.dbf’  
       SIZE 2000M EXTENT MANAGEMENT LOCAL UNIFORM size 16M; 
       其它月份以后同以上(我在此采用oracle的表空间本地管理的方法)。   2). 建立分区索引表空间 
       1.分区1:index_detail_200309 
       CREATE TABLESPACE index_detail_200309  DATAFILE   
       ‘/u3/oradata/orcl/index_detail_20030901.dbf’  
       SIZE 2000M  EXTENT MANAGEMENT LOCAL UNIFORM size 16M; 
    5.建立基于分区的表: 
       create  table  table name 
       ( 
        ........ 
         
        enable row movment               --此语句是能修改行分区键值,也就是如不添加该                                     句不能修改记录的分区键值,不能使记录分区迁移 
        PARTITION   BY   RANGE  (TRANS_DATE) 
        ( 
           PARTITION     crm_detail_200309  VALUES  LESS THAN  
    (TO_DATE (‘09/01/2003’,’mm/dd/yyyy’   
     TABLESPACE   crm_detail_200309, 
           其他分区..... 
         ; 
    6.建立基于分区的索引: 
      create  index   index_name  on table_name (分区键+…) 
       global                                  --这里是全局分区索引,也可以建本地索引 
       PARTITION   BY   RANGE  (TRANS_DATE) 
       ( 
         PARTITION     index_detail_200309  VALUES  LESS THAN  
         (TO_DATE ('09/01/2003','mm/dd/yyyy' )  
         TABLESPACE   index_detail_200309, 
         其他索引分区... 
        ; 
        
    对表的分区就这样完成了,第一次主要确定表分区的分区策约是最重要的,可我觉得对表分区难在以后对表分区的管理上面,因为随着数据量的增加,表分区必然存在删除,扩容,增加等。在这些过程中还牵涉到全局等索引,因为对分区表进行ddl操作为破坏全局索引,故全局索引必须在ddl后要重rebuild. 
    [出处:http://www.douzhe.com/docs/jh/19/158866.html]
      

  2.   

    你可以使用 dbms_metadata.get_ddl(type,name,owner) 来获得一个对象的 ddl 语句
      

  3.   

    1 、分区表的建立: 
      某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生30M的数据),操作如下: 
    STEP1、建立表的各个分区的表空间: 
    CREATE TABLESPACE ts_sale1999q1 
    DATAFILE ‘/u1/oradata/sales/sales1999_q1.dat’ 
    SIZE 100M 
    DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0) 
    CREATE TABLESPACE ts_sale1999q2 
    DATAFILE ‘/u1/oradata/sales/sales1999_q2.dat’ 
    SIZE 100M 
    DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0) 
    CREATE TABLESPACE ts_sale1999q3 
    DATAFILE ‘/u1/oradata/sales/sales1999_q3.dat’ 
    SIZE 100M 
    DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0) 
    CREATE TABLESPACE ts_sale1999q4 
    DATAFILE ‘/u1/oradata/sales/sales1999_q4.dat’ 
    SIZE 100M 
    DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0) 
    STEP2、建立基于分区的表: 
    CREATE TABLE sales 
    (invoice_no NUMBER, 
    ... 
    sale_date DATE NOT NULL ) 
    PARTITION BY RANGE (sale_date) 
    (PARTITION sales1999_q1 
    VALUES LESS THAN (TO_DATE(‘1999-04-01’,’YYYY-MM-DD’) 
    TABLESPACE ts_sale1999q1, 
    PARTITION sales1999_q2 
    VALUES LESS THAN (TO_DATE(‘1999-07-01’,’YYYY-MM-DD’) 
    TABLESPACE ts_sale1999q2, 
    PARTITION sales1999_q3 
    VALUES LESS THAN (TO_DATE(‘1999-10-01’,’YYYY-MM-DD’) 
    TABLESPACE ts_sale1999q3, 
    PARTITION sales1999_q4 
    VALUES LESS THAN (TO_DATE(‘2000-01-01’,’YYYY-MM-DD’) 
    TABLESPACE ts_sale1999q4 ); 
    2 、分区表的扩容: 到了1999年年底,DBA应向表中加入2000年的表空间,同样是每季度一个表空间,由于公司业务欣欣向荣,预计每个分区为40M,操作如下。 
    STEP1、建立表空间: 
    CREATE TABLESPACE ts_sale2000q1 
    DATAFILE ‘/u1/oradata/sales/sales2000_q1.dat’ 
    SIZE 130M 
    DEFAULT STORAGE (INITIAL 40m NEXT 40m MINEXTENTS 3 PCTINCREASE 0) 
    其他表空间ts_sale2000q2,ts_sale2000q3,ts_sales2000q4如法炮制。 
    STEP2、为表添加表空间: 
    ALTER TABLE sales 
    ADD PARTITION sales2000_q1 
    VALUES LESS THAN (TO_DATE(‘2000-04-01’,’YYYY-MM-DD’) 
    TABLESPACE ts_sale2000q1; 
    其他分区sales2000_q1,sales2000_q1,sales2000_q1如法炮制。 
    3 、删除不必要的分区: 公司规定:销售的明细数据两年内必须保存在线。到2001年,DBA必须将1999年的数据备份(备份方法见5、EXPORT分区),将1999年的分区删除,将空间供后来的数据使用。如此循环,永远保持两年的销售数据在线。 STEP1、DROP 分区: 
    ALTER TABLE sales 
    DROP PARTION sales1999_q1; 
    ALTER TABLE sales 
    DROP PARTION sales1999_q2; 
    ALTER TABLE sales 
    DROP PARTION sales1999_q3; 
    ALTER TABLE sales 
    DROP PARTION sales1999_q4; 
    STEP2、利用操作系统的工具删除以上表空间占用的文件(表空间基于裸设备无须次步),UNIX系统为例: 
    oracle$ rm /u1/oradata/sales/sales1999_q1.dat 
    oracle$ rm /u1/oradata/sales/sales1999_q2.dat 
    oracle$ rm /u1/oradata/sales/sales1999_q3.dat 
    oracle$ rm /u1/oradata/sales/sales1999_q4.dat 
    4 、分区的其他操作: 分区的其他操作包括截短分区(truncate),将存在的分区划分为多个分区(split),交换分区(exchange),重命名(rename),为分区建立索引等。DBA可以根据适当的情况使用。 
    以下仅说明分裂分区(split),例如该公司1999年第四季度销售明细数据急剧增加(因为庆国庆、迎千禧、贺回归),DBA向公司建议将第四季度的分区划分为两个分区,每个分区放两个月份的数据,操作如下: 
    STEP1、按(1)的方法建立两个分区的表空间ts_sales1999q4p1, 
    ts_sales1999q4p2; 
    STEP2、给表添加两个分区sales1999_q4_p1,sales1999_q4_p2; 
    STEP3、分裂分区: 
    ALTER TABLE sales 
    SPLIT PARTITON sales1999_q4 
    AT TO_DATE (‘1999-11-01’,’YYYY-MM-DD’) 
    INTO (partition sales1999_q4_p1, partition sales1999_q4_p2) 
    5 、查看分区信息: DBA要查看表的分区信息,可查看数据字典USER_EXTENTS,操作如下: 
    SVRMGRL>SELECT * FROM user_extents WHERE SEGMENT_NAME=’SALES’; 
    SEGMENT_NA PARTITION_ SEGMENT_TYPE TABLESPACE 
    ---------- ------------ --------------- -------------- 
    SALES SALES1999_Q1 TABLE PARTITION TS_SALES1999Q1 
    SALES SALES1999_Q2 TABLE PARTITION TS_SALES1999Q2 
    SALES SALES1999_Q3 TABLE PARTITION TS_SALES1999Q3 
    SALES SALES1999_Q4 TABLE PARTITION TS_SALES1999Q4 
    SALES SALES2000_Q1 TABLE PARTITION TS_SALES1999Q1 
    SALES SALES2000_Q2 TABLE PARTITION TS_SALES1999Q2 
    SALES SALES2000_Q3 TABLE PARTITION TS_SALES1999Q3 
    SALES SALES2000_Q4 TABLE PARTITION TS_SALES1999Q4 
    5 、EXPORT分区: ORACLE8的EXPORT 工具可在表的分区以及导出数据,例如到2001年,DBA必须将1999年的数据按分区导出,操作如下: 
    oracle$ exp sales/sales_password tables=sales:sales1999_q1 rows=Y 
    file=sales1999_q1.dmp 
    oracle$ exp sales/sales_password tables=sales:sales1999_q2 rows=Y 
    file=sales1999_q2.dmp 
    oracle$ exp sales/sales_password tables=sales:sales1999_q3 rows=Y 
    file=sales1999_q3.dmp 
    oracle$ exp sales/sales_password tables=sales:sales1999_q4 rows=Y 
    file=sales1999_q4.dmp 
    6 、IMPORT分区: ORACLE8的IMPORT 工具可在表的分区以及导入数据,例如在2001年,用户要查看1999年的数据,DBA必须导入1999年的数据,使之在线,操作如下: 
    STEP1、建立表的1999年的四个表空间和相应的分区,参照(2); 
    STEP2、导入数据: 
    oracle$ imp sales/sales_password FILE =sales1999_q1.dmp 
    TABLES = (sales:sales1999_q1) IGNORE=y 
    oracle$ imp sales/sales_password FILE =sales1999_q2.dmp 
    TABLES = (sales:sales1999_q2) IGNORE=y 
    oracle$ imp sales/sales_password FILE =sales1999_q3.dmp 
    TABLES = (sales:sales1999_q3) IGNORE=y 
    oracle$ imp sales/sales_password FILE =sales1999_q4.dmp 
    TABLES = (sales:sales1999_q4) IGNORE=y 
            [若有用,你参考参考]
      

  4.   

    分区表的建立和维护我大概了解。我的问题是怎么得到已有的分区表的结构语法。 zealot_zk(风中追风) 兄的包我在817中怎么找不到啊