精华内容
下载资源
问答
  • Create tablespace pro Datafile 'd\oradata\workts01.dbf Size 3m Autoextend on 请问上面datafile workts01.dbf文件里面包括表空间吗?
  • 此文从以下几方面来整理关于分区的概念及...是一或多数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是, 所以称作表空间。 分区: 当中的数据量不断增大,查询数据的速度就

    此文从以下几个方面来整理关于分区表的概念及操作:
    1.表空间及分区表的概念
    2.表分区的具体作用
    3.表分区的优缺点
    4.表分区的几种类型及操作方法
    5.对表分区的维护性操作.
    (1.) 表空间及分区表的概念
    表空间:
    是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。

    分区表:
    当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

    ( 2).表分区的具体作用
    Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。

    分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。

    什么时候使用分区表:
    1、表的大小超过2GB。
    2、表中包含历史数据,新的数据被增加都新的分区中。

    (3).表分区的优缺点
    表分区有以下优点:
    1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
    2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
    3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
    4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

    缺点:
    分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。

    (4).表分区的几种类型及操作方法

     一.范围分区:

    范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。举个例子:你可能会将销售数据按照月份进行分区。
    当使用范围分区时,请考虑以下几个规则:
    1、每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
    2、所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
    3、在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。

    例一:
    假设有一个CUSTOMER表,表中有数据200000行,我们将此表通过CUSTOMER_ID进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下:

    复制代码 代码如下:

    CREATE TABLE CUSTOMER
    (
        CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,
        FIRST_NAME  VARCHAR2(30) NOT NULL,
        LAST_NAME   VARCHAR2(30) NOT NULL,
        PHONEVARCHAR2(15) NOT NULL,
        EMAILVARCHAR2(80),
        STATUS       CHAR(1)
    )
    PARTITION BY RANGE (CUSTOMER_ID)
    (
        PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,
        PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02
    )


    例二:按时间划分
    复制代码 代码如下:

    CREATE TABLE ORDER_ACTIVITIES
    (
        ORDER_ID      NUMBER(7) NOT NULL,
        ORDER_DATE    DATE,
        TOTAL_AMOUNT NUMBER,
        CUSTOTMER_ID NUMBER(7),
        PAID   CHAR(1)
    )
    PARTITION BY RANGE (ORDER_DATE)
    (
      PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01,
      PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,
      PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03
    )

    例三:MAXVALUE

    复制代码 代码如下:

    CREATE TABLE RangeTable
    (
      idd   INT PRIMARY KEY ,
      iNAME VARCHAR(10),
      grade INT 
    )
    PARTITION  BY  RANGE (grade)
    (
          PARTITION  part1 VALUES  LESS  THEN (1000) TABLESPACE  Part1_tb,
          PARTITION  part2 VALUES  LESS  THEN (MAXVALUE) TABLESPACE  Part2_tb
    );
     

    二.列表分区:

    该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。

    例一

    复制代码 代码如下:

    CREATE TABLE PROBLEM_TICKETS
    (
        PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,
        DESCRIPTION  VARCHAR2(2000),
        CUSTOMER_ID  NUMBER(7) NOT NULL,
        DATE_ENTERED DATE NOT NULL,
        STATUS       VARCHAR2(20)
    )
    PARTITION BY LIST (STATUS)
    (
          PARTITION PROB_ACTIVE   VALUES ('ACTIVE') TABLESPACE PROB_TS01,
          PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02

    )


     

    例二

    复制代码 代码如下:

    CREATE  TABLE  ListTable
    (
        id    INT  PRIMARY  KEY ,
        name  VARCHAR (20),
        area  VARCHAR (10)
    )
    PARTITION  BY  LIST (area)
    (
        PARTITION  part1 VALUES ('guangdong','beijing') TABLESPACE  Part1_tb,
        PARTITION  part2 VALUES ('shanghai','nanjing')  TABLESPACE  Part2_tb
    );
    )


    三.散列分区:

    这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
    散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。

    例一:

    复制代码 代码如下:

    CREATE TABLE HASH_TABLE
    (
      COL NUMBER(8),
      INF VARCHAR2(100)
    )
    PARTITION BY HASH (COL)
    (
      PARTITION PART01 TABLESPACE HASH_TS01,
      PARTITION PART02 TABLESPACE HASH_TS02,
      PARTITION PART03 TABLESPACE HASH_TS03
    )


    简写:
    复制代码 代码如下:

    CREATE TABLE emp
    (
        empno NUMBER (4),
        ename VARCHAR2 (30),
        sal   NUMBER
    )
    PARTITION BY  HASH (empno) PARTITIONS 8
    STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
     

    hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

    四.组合范围散列分区

    这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。

    复制代码 代码如下:

    CREATE TABLE SALES
    (
    PRODUCT_ID VARCHAR2(5),
    SALES_DATE DATE,
    SALES_COST NUMBER(10),
    STATUS VARCHAR2(20)
    )
    PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
    (
       PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009
      (
          SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
          SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
      ),
       PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009
      (
          SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
          SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
      )
    )


    五.复合范围散列分区:

    这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。

    复制代码 代码如下:

    create table dinya_test
     (
     transaction_id number primary key,
     item_id number(8) not null,
     item_description varchar2(300),
     transaction_date date
     )
     partition by range(transaction_date)subpartition by hash(transaction_id)  subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
     (
         partition part_01 values less than(to_date(‘2006-01-01','yyyy-mm-dd')),
         partition part_02 values less than(to_date(‘2010-01-01','yyyy-mm-dd')),
         partition part_03 values less than(maxvalue)
     );
     

    (5).有关表分区的一些维护性操作:

    一、添加分区

    以下代码给SALES表添加了一个P3分区

    复制代码 代码如下:

    ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));

    注意:以上添加的分区界限应该高于最后一个分区界限。
    以下代码给SALES表的P3分区添加了一个P3SUB1子分区

    复制代码 代码如下:

    ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');

    二、删除分区
    以下代码删除了P3表分区:

    复制代码 代码如下:

    ALTER TABLE SALES DROP PARTITION P3;
     

    在以下代码删除了P4SUB1子分区:

    复制代码 代码如下:

    ALTER TABLE SALES DROP SUBPARTITION P4SUB1;
     

    注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。
    三、截断分区

    截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:

    复制代码 代码如下:

    ALTER TABLE SALES TRUNCATE PARTITION P2;
     

    通过以下代码截断子分区:

    复制代码 代码如下:

    ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
     

    四、合并分区

    合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:

    复制代码 代码如下:

    ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
     

    五、拆分分区

    拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。

    ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
     

    六、接合分区(coalesca)
    结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区:

    复制代码 代码如下:

    ALTER TABLE SALES COALESCA PARTITION;

    七、重命名表分区

    以下代码将P21更改为P2

    复制代码 代码如下:

    ALTER TABLE SALES RENAME PARTITION P21 TO P2;
     

    八、相关查询

    跨分区查询

    复制代码 代码如下:

    select sum( *) from
    (select count(*) cn from t_table_SS PARTITION (P200709_1)
    union all
    select count(*) cn from t_table_SS PARTITION (P200709_2)
    );
     

    查询表上有多少分区

    复制代码 代码如下:

    SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'
     

    查询索引信息

    复制代码 代码如下:

    select object_name,object_type,tablespace_name,sum(value)
    from v$segment_statistics
    where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'
    group by object_name,object_type,tablespace_name
    order by 4 desc

    --显示数据库所有分区表的信息:
    select * from DBA_PART_TABLES

    --显示当前用户可访问的所有分区表信息:
    select * from ALL_PART_TABLES

    --显示当前用户所有分区表的信息:
    select * from USER_PART_TABLES

    --显示表分区信息 显示数据库所有分区表的详细分区信息:
    select * from DBA_TAB_PARTITIONS

    --显示当前用户可访问的所有分区表的详细分区信息:
    select * from ALL_TAB_PARTITIONS

    --显示当前用户所有分区表的详细分区信息:
    select * from USER_TAB_PARTITIONS

    --显示子分区信息 显示数据库所有组合分区表的子分区信息:
    select * from DBA_TAB_SUBPARTITIONS

    --显示当前用户可访问的所有组合分区表的子分区信息:
    select * from ALL_TAB_SUBPARTITIONS

    --显示当前用户所有组合分区表的子分区信息:
    select * from USER_TAB_SUBPARTITIONS

    --显示分区列 显示数据库所有分区表的分区列信息:
    select * from DBA_PART_KEY_COLUMNS

    --显示当前用户可访问的所有分区表的分区列信息:
    select * from ALL_PART_KEY_COLUMNS

    --显示当前用户所有分区表的分区列信息:
    select * from USER_PART_KEY_COLUMNS

    --显示子分区列 显示数据库所有分区表的子分区列信息:
    select * from DBA_SUBPART_KEY_COLUMNS

    --显示当前用户可访问的所有分区表的子分区列信息:
    select * from ALL_SUBPART_KEY_COLUMNS

    --显示当前用户所有分区表的子分区列信息:
    select * from USER_SUBPART_KEY_COLUMNS

    --怎样查询出oracle数据库中所有的的分区表
    select * from user_tables a where a.partitioned='YES'

    --删除一个表的数据是
    truncate table table_name;

    --删除分区表一个分区的数据是
    alter table table_name truncate partition p5;
    展开全文
  • DB2中如果系统临时表空间,那么到底会用到哪一呢?
    问题:DB2中如果有多个系统临时表空间,那么到底会用到哪一个呢?
    


    解答:
    信息中心提到的关于临时表空间的选择顺序如下,并没有提到32K的表空间一定会优先使用32K的系统临时表空间,只是说优化器会进行选择,但也没有提供更详细的信息,DB2优化器会优先选择缓冲池大的:

    如果数据库使用多个临时表空间,并且需要新的临时对象,那么优化器将为此对象选择相应的页大小。 然后将把该对象分配到具有相应页大小的临时表空间中。如果存在多个临时表空间具有该页大小,那么将以循环方式选择表空间。在大多数情况下,建议对于任何一个页大小,不要使用多个临时表空间。 

    https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_9.5.0/com.ibm.db2.luw.admin.dbobj.doc/doc/c0052067.html

    In general, when temporary table spaces of different page sizes exist, the optimizer will choose the temporary table space whose buffer pool can hold the most number of rows (in most cases that means the largest buffer pool).  

    https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.dbobj.doc/doc/c0004975.html


    如果您希望数据库使用指定的临时表空间,可以只保留指定的临时表空间,将系统自己创建的临时表空间删掉。

    我下面做了一个测试,测试表明,在32K永久表空间里的表进行排序时,在存在32K系统临时表空间的情况下,也可能用到4K的系统临时表空间,而非32K的:

    1. 排序相关内存调小,确保会用到临时表空间

    db2 get dbm cfg | find /i "SHEAPTHRES"
     Sort heap threshold (4KB)                  (SHEAPTHRES) = 250
    
    db2 get db cfg for sample | find /i "sort"
     Sort heap thres for shared sorts (4KB) (SHEAPTHRES_SHR) = 250
     Sort list heap (4KB)                         (SORTHEAP) = 16

    2. 创建两个系统临时表空间,一个4K的,一个32K的,其中前者的缓冲池较大,并删除系统自带的临时表空间。最后创建一个32K的永久表空间。

    db2 "connect to sample"
    db2 "create bufferpool buf4k IMMEDIATE size 10000 automatic pagesize 4 k"
    db2 "create bufferpool buf32k IMMEDIATE size 100 automatic pagesize 32 k" 
    db2 "create system temporary tablespace mysystmp4k pagesize 4 k managed by database using (file 'contmp1' 200) bufferpool buf4k"
    db2 "create system temporary tablespace mysystmp32k pagesize 32 k managed by database using (file 'contmp2' 200) bufferpool buf32k"
    db2 "drop tablespace TEMPSPACE1"
    db2 "create tablespace tbs32k pagesize 32 k managed by system using ('c:\contmppah') bufferpool buf32k"


    3. 在32K的表空间里创建一张表,并导入数据,这里我导入了几十万条数据,也是为了确保用到临时表空间

    db2 "create table t3(id int, name char(20)) in tbs32k"
    db2 "load from t3.del of del insert into t3 nonrecoverable"
    db2 "select * from t3 order by name"
    
    ID          NAME
    ----------- --------------------
    SQL0289N  Unable to allocate new pages in table space "MYSYSTMP4K".
    SQLSTATE=57011

    可以看到,虽然T3是在32K页大小的表空间中,但排序时用的却是4K的系统临时表空间,同时可以在诊断日志中看到如下报错:

    2017-06-07-10.24.37.406000+480 E3506705F1169        LEVEL: Error
    PID     : 10400                TID : 11740          PROC : db2syscs.exe
    INSTANCE: DB2INST1             NODE : 000           DB   : SAMPLE
    APPHDL  : 0-510                APPID: *LOCAL.DB2INST1.170607020154
    AUTHID  : MIAOQINGSONG         HOSTNAME: ADMINIB-PR7US3I
    EDUID   : 11740                EDUNAME: db2agent (SAMPLE)
    FUNCTION: DB2 UDB, buffer pool services, sqlbAllocateExtent, probe:996
    MESSAGE : ADM6044E  The DMS table space "MYSYSTMP4K" (ID "4") is full.  If this
              is an autoresize or automatic storage DMS tablespace, the maximum
              table space size may have been reached or the existing containers or
              storage paths cannot grow any more. Additional space can be added to
              the table space by either adding new containers or extending existing
              ones using the ALTER TABLESPACE SQL statement. If this is an
              autoresize or automatic storage DMS table space, additional space can
              be added by adding containers to an autoresize table space or by
              adding new storage paths to the storage group it is using.

    2017-06-07-10.24.37.437000+480 I3507876F1278        LEVEL: Warning
    PID     : 10400                TID : 11740          PROC : db2syscs.exe
    INSTANCE: DB2INST1             NODE : 000           DB   : SAMPLE
    APPHDL  : 0-510                APPID: *LOCAL.DB2INST1.170607020154
    AUTHID  : MIAOQINGSONG         HOSTNAME: ADMINIB-PR7US3I
    EDUID   : 11740                EDUNAME: db2agent (SAMPLE)
    FUNCTION: DB2 UDB, buffer pool services, sqlbObtainDataExtent, probe:800
    MESSAGE : ZRC=0x85020021=-2063466463=SQLB_END_OF_CONTAINER
              "DMS Container space full"
    DATA #1 : Object descriptor, PD_TYPE_SQLB_OBJECT_DESC, 104 bytes
        Obj: {pool:4;obj:2;type:128} Parent={4;2}
        lifeLSN:       0090353724100706
        tid:           0 0  0
        extentAnchor:                  64
        initEmpPages:                  32
        poolPage0:                     96
        poolflags:   0x              4112
        objectState: 0x                27
        lastSMP:                        0
      pageSize:                    4096
      extentSize:                    32
      bufferPoolID:                   3
      partialHash:           2147614724
      objDescAttributes:                  0
      objDescEHLState: 0x0000000000000000
      bufferPool:    0x00000000237a9dc0
      pdef:          0x00000000237cb040


    最后,附上如何找到耗尽临时表空间的应用
    http://www-01.ibm.com/support/docview.wss?uid=swg21992464

    展开全文
  • 有两个实体 一个是HR,一个是部门经理 在建表的时候,这两个实体都在管理人员信息用,用职位类别区分 这样弄可以吗 如果可以的话 那ER图上需要用什么符号将两个实体联系起来,说明这是在同一个
  • Oracle创建表空间、用户、全程指南 ...每个表空间由一或多物理文件(.dbf)组成,一用户可以分配多个表空间,但只能默认表空间,每张可以存在于一或多个表空间中(比如图中的1)



    背景


      之前的DRP项目虽然用到了oracle,但是所有数据库对象的建立都是按文档来的,并没有仔细思考总结,后面再次用到oracle时,不能再那么糊里糊涂的用了,得稍微探索一下下了,究竟这些oracle中的数据库对象之间都存在什么关系呢?

      Think about it,在SQL Server或者MySQL中,一般情况下(暂不考虑多租户等特殊情况),一个项目对应DBMS中的一个数据库,连接字符串中是用“用户名+密码+数据库名”来唯一标识数据库,一个用户可以管理多个数据库;而连接oracle中的字符串主要是用户名+密码来标识数据库,即一个用户管理一个方案(方案就是某用户拥有的所有的数据库对象的逻辑集合,可以看做是SQL Server或MySQL中的一个数据库)。

      通俗来说,除了数据库地址,一个程序连接MySQL或SQLServer需要提供用户名、密码和它需要连接的数据库名,连接Oracle则需要提供用户名和密码即可。


    Oracle中建立表空间、用户、表


      下面通过一个在oracle中建立方案的例子来说明oracle中表空间、用户、表之间的关系。

      一般在oracle中建立方案的步骤为:创建表空间→创建用户并设置其表空间和权限→创建数据库对象(表、视图、索引等)

      (1)先用system用户登录oracle

      (2)新建表空间:

    create tablespace tbs_danny datafile 'D:\oracle\oracledata\danny\danny_data.dbf' size 50M;

       这里写图片描述

      (3)新建用户并为此用户分配默认的表空间:

    create user danny identified by danny default tablespace tbs_danny;

       这里写图片描述

      (4)为用户授权
      刚才建立的用户,只是个空壳,神马权限都没有。
      如果不为其分配connect的权限,则连登录都会被拒绝:
      
      这里写图片描述

      为其设置了connect权限之后,就可以登录了:

       这里写图片描述

      除此之外,还要为其设置resource权限,这样用户才有权查看、修改属于自己的数据库对象:

    grant resource to danny;

      (5)建立表

    create table t_user_by_danny(id varchar(32),name varchar(32)) tablespace tbs_danny;

      当然也可以不指定表空间

    create table t_user_by_danny(id varchar(32),name varchar(32));

      查询一下,在表空间tbs_danny下属于用户danny的表已经有了:

       这里写图片描述

      建表时如果不指定表空间,表自动放到默认表空间下。

      到这里,最简单的方案基本上就完成了。


    分析总结


      下面用一张图来分析一下上面的过程

      这里写图片描述

      一个方案对应一个项目,对应一个用户;每个用户可以管理多个表空间,每个表空间由一个或多个物理文件(.dbf)组成,一个用户可以分配多个表空间,但只能有一个默认表空间,每张表可以存在于一个或多个表空间中(比如图中的表1)。

      如果您有点好奇心,可能会问道,那多个用户可以共享一个表空间吗?答案是可以的,所以这张图可以这么画:
      这里写图片描述

      接着上面的例子,如果再建立一个用户xiaohu,并且设置xiaohu的默认表空间也是tbs_danny,并在用户xiaohu下建立表t_user_by_xiaohu,也是可以实现的,只不过这两个用户danny和xiaohu都只有权查看和管理属于自己的数据库对象:

      这里写图片描述

      只不过一般不会这么做,如果多个用户都共享一个表空间的话,那就体现不了表空间的意义啦!您说是吧 ~_~ 嘿嘿 ~_~




    【 转载请注明出处——胡玉洋《探秘Oracle中表空间、用户、表之间的关系》


    展开全文
  • 方式一:通过delete语句删除 这也是我们最常用的方式,但是这种方式只适合删除数据量较小的 先建一张表:test_log1

            删除表数据我们通常会使用delete语句来删除,但是执行完delete语句删除了表中部分数据后你会发现表对应的存储文件大小并不会缩小,如果要进一步释放被删除数据的空间需要执行optimize table tablename命令来进行优化(详情可看看这篇文章:http://blog.51yip.com/mysql/1222.html)。如果表的数据量非常巨大比如项目里一些日积月累不断变大的日志表,使用delete语句删除部分过期的日志数据可能需要执行很长时间,想要释放存储空间使用optimize优化也要优化很长时间,用truncate把整个表也不合适,这种情况下建表的时候可以将表建成分区表,删数据的时候直接删表分区。

    下面我们来做一个小实验来测试这两种删数据的方式

    首先建一张名为test_log以时间字段为分区的表:

    CREATE TABLE `test_log` (
      `product_id` varchar(20) DEFAULT NULL COMMENT '客户端的产品标识',
      `client_version` varchar(20) DEFAULT NULL COMMENT '客户端的版本号简称',
      `os_type` varchar(20) DEFAULT NULL COMMENT '用户手机操作系统的类型',
      `imsi` varchar(50) DEFAULT NULL COMMENT '用户手机的 IMSI 号',
      `insert_time` datetime DEFAULT NULL COMMENT '当前日志记录的入库时间'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试日志表'
    partition by range (to_days(insert_time))
    (	
    	PARTITION p0 VALUES LESS THAN (to_days('2016-01-01')),
    	PARTITION p1 VALUES LESS THAN (to_days('2016-02-01')),
    	PARTITION p2 VALUES LESS THAN (to_days('2016-03-01')),
    	PARTITION p3 VALUES LESS THAN (to_days('2016-04-01')),
    	PARTITION p4 VALUES LESS THAN (to_days('2016-05-01')),
    	PARTITION p5 VALUES LESS THAN (to_days('2016-06-01')),
    	PARTITION p6 VALUES LESS THAN (to_days('2016-07-01')),
    	PARTITION p7 VALUES LESS THAN (to_days('2016-08-01')),
    	PARTITION p8 VALUES LESS THAN (to_days('2016-09-01')),
    	PARTITION p9 VALUES LESS THAN (to_days('2016-10-01')),
    	PARTITION p10 VALUES LESS THAN (to_days('2016-11-01')),
    	PARTITION p11 VALUES LESS THAN (to_days('2016-12-01')),
    	PARTITION p12 VALUES LESS THAN MAXVALUE
    );


    可以看到个表分区的文件都为默认的空表大小96kb:


    导入一些测试数据后再看:


    方式一:使用delete语句删除

    删除p0分区对应的日期小于‘2016-01-01’的数据:

    mysql> delete from test_log where insert_time < '2016-01-01';
    Query OK, 15360 rows affected (0.15 sec)
    再看看分区表文件,可以看到只更新了时间,但是存储大小没有变化:


    执行optimize table test_log进行优化:

    mysql> optimize table test_log;
    +---------------+----------+----------+-----------------------------------------
    --------------------------+
    | Table         | Op       | Msg_type | Msg_text
                              |
    +---------------+----------+----------+-----------------------------------------
    --------------------------+
    | test.test_log | optimize | note     | Table does not support optimize, doing r
    ecreate + analyze instead |
    | test.test_log | optimize | status   | OK
                              |
    +---------------+----------+----------+-----------------------------------------
    --------------------------+
    2 rows in set (2.14 sec)
    再看看分区表文件,发现p0分区的文件变回了默认大小96kb,空间已经释放:

    需要特别注意的是,这种方式并不适合所有的表,optimize优化操作期间会造成锁表。


    方式二:删除表分区来删除数据

    执行ALTER TABLE test_log DROP PARTITION p1删除分区p1的数据:

    mysql> ALTER TABLE test_log DROP PARTITION p1;
    Query OK, 0 rows affected (0.04 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    看看表分区文件,发现p1的分区文件已经被删除了自然也就不存在释放存储空间的问题了:

    一般日志表都需要定时删除,我们可以写一个存储过程来定时执行,如果有多张表,分区信息也相同的话,也可以放一个存储过程里一起删除:

    先创建一张分区信息表dict_table_partion:

    CREATE TABLE `dict_table_partion` (
      `par_name` varchar(10) DEFAULT NULL,
      `par_date` date DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    导入分区信息数据:

    再建一张存储删除分区语句的信息表drop_partion_sql:

    CREATE TABLE `drop_partion_sql` (
      `drop_sql` varchar(300) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    导入需要的删除的表分区语句:


    新建一个存储过程pro_del_partion删除半年前的个日志表的分区数据:

    BEGIN
    	DECLARE v_par_date date DEFAULT DATE_FORMAT(CURRENT_DATE(), '%Y-%m-01') - INTERVAL + 6 + 1 MONTH;
    	DECLARE done INT DEFAULT 0;
      DECLARE v_drop_sql varchar(1000);
      DECLARE cur_index_sql cursor  for
    						SELECT t.drop_sql
    						FROM drop_partion_sql t;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    	SET @par_name = (SELECT par_name FROM dict_table_partion WHERE par_date = v_par_date);
    	OPEN cur_index_sql;   
      index_sql_loop:LOOP 
    			FETCH cur_index_sql INTO v_drop_sql; 
    		IF done=1 THEN
    			LEAVE index_sql_loop;
    		END IF;   
    		SET @s = concat(v_drop_sql, ' ', @par_name);
    		SELECT @s;
    		PREPARE stmt FROM @s;
    		EXECUTE stmt;
    		DEALLOCATE PREPARE stmt;
    	END LOOP index_sql_loop;
    END
    每月执行这个存储过程来删除日志表的分区数据。



    展开全文
  • 进入新建表空间的对话框中,输入表空间名称:TBS,并添加两个表空间数据文件,设定相关的存储路径/大小等参数。 3 建立用户TEST 在“新建用户”对话框中,输入相关的信息,创建PONY用户。注意选
  • Greenplum创建和管理表空间(Tablespace)

    千次阅读 2018-11-14 23:08:28
    目录   一、概述 二、使用gpfilespace创建...表空间(Tablespace)允许数据库管理员在每机器上使用多文件系统(FileSystem),决定如何更好地使用物理存储空间来存储数据库对象。表空间被命名为在文件空间(Fil...
  • oracle创建表空间深入学习

    千次阅读 2018-07-20 15:04:59
    oracle中的就是一张存储数据的表空间是逻辑上的划分。方便管理的。 数据表空间 (Tablespace) 存放数据总是需要空间, Oracle把一数据库按功能划分若干空间来保存数据。当然数据存放在磁盘最终是以文件形式...
  • InnoDB 中不保存的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个来计算多少行。 MyISAM只要简单的读出保存好的行数即可。 注意的是,当count()语句包含 where条件时,的...
  • 首先,使用下面的命令移动:alter table table_name move tablespace tablespace_name;然后,如果索引的话必须重建索引:alter index ...当然,可以使用spool来帮助实现多个表的操作.set header off;spool /export/home
  • 深入理解DB2表空间(Tablespace)

    万次阅读 2012-10-21 16:16:00
    表空间是数据库系统中数据库逻辑结构与操作系统物理结构之间建立映射的重要存储结构,它作为数据库与实际存放数据的容器之间的中间层,用于指明数据库中数据的物理位置。任何数据库的创建都必须显式或隐式的为其指定...
  • innodb在实现表空间(table space)基于文件IO之上构建的一层逻辑存储空间管理,table space采用逻辑分层的结构:...磁盘链表的实现fut0lst.*文件当中, innodb为了管理表空间和索引模块,定义了一基于磁盘的链表
  • 小的应用系统一般也十几个表,大型系统一般上千个表。    我们以学生成绩查询为例来讲解的关联。除了Student,这里我们需要新建成绩Grade:   Sno Cno Grade S01 ...
  • MySQL表空间简介

    万次阅读 2018-11-13 11:02:47
    本文主要介绍一下MySQL中的几种表空间概念及相关操作。 基础材料: CentOS7.5 MySQL 5.7.24 ...相关定义 : 一般用来存放mysql系统相关信息的一特殊的共享表空间 存放路径 : 默认为MySQL初始化路径下的ibdat...
  • 在mysql中information_schema数据库,这数据库中装的是mysql的元数据,包括数据库信息、数据库中的信息等。所以要想查询数据库占用磁盘的空间大小可以通过对information_schema数据库进行操作。 ...
  • 不要让临时表空间影响数据库性能

    千次阅读 2016-12-26 16:36:26
    一般Oracle数据库(Oracle Database)可以分为部分,即实例(Instance)和数据库(Database)。 实例:是一非固定的、基于内存的基本进程与内存结构。当服务器关闭后,实例也就不存在了。 数据库(Database)指...
  • DB2表空间管理

    千次阅读 2007-09-29 11:49:00
     使用表空间的一明显的好处是能够把数据合理的分布存储在不同的磁盘上或者存储在磁盘的不同位置上,助于提高数据存取的效率。 DB2 的表空间按管理方式分为种:系统管理空间(System Management Space,SMS)...
  • 之所以说这两个概念容易混淆,是因为对于PostgreSQL来说,这是完全相同的两个对象。唯一的区别是在创建的时候:  1.我用下面的psql创建了角色kanon:  CREATE ROLE kanon PASSWORD 'kanon';  接着我使用新创建...
  • 临时表空间作用

    千次阅读 2010-09-03 17:00:00
    临时表空间
  • Oracle表空间(tablespaces)简介

    千次阅读 2017-04-19 10:11:26
    我们知道oarcle数据库真正存放数据的是数据文件(data files),Oarcle表空间(tablespaces)实际上是一逻辑的概念,他在物理上是并不存在的,那么把一组data files 捻在一起就成为一个表空间表空间...
  • db2 表空间 缓冲池

    千次阅读 2014-03-30 11:49:50
    在本文中,我们将讨论 DBA 要做出重要选择的两个方面:表空间和缓冲池。表空间和缓冲池的设计和调优会对 DB2 服务器的性能产生深远的影响,因此我们将着重讨论这些活动。 在我们的示例中,我们将使用 DB2 V8.1 ...
  • InnoDB 中不保存的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个来计算多少行。 MyISAM只要简单的读出保存好的行数即可。 注意的是,当count(*)语句包含 where条件时,种...
  • InnoDB 中不保存的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个来计算多少行。 MyISAM只要简单的读出保存好的行数即可。 注意的是,当count(*)语句包含 where条件时,种...
  • 关于Oracle大字段表空间的清理思路

    千次阅读 2018-08-30 15:34:02
    最近发现生产库中临时的大字段缓存增长的非常厉害,几乎天就需要消耗掉30G的容量,这样下去就算是磁盘容量再大没几天也要撑爆。 所以想到定期清理,因为含有blob字段,清理方式略不同,以下是我清理大...
  • System.Data.SqlClient命名空间下的 sqlDependency类 可以实现这样的功能:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发...首先,建立一数据库 并在其中建立一张表,如下图所示:
  • 另外实际操作过程中还发现这问题还存在种情况。 (1)当DELETE后面跟条件的时候,则就会出现这问题。如: delete from table_name where 条件 删除数据后,数据占用的空间大小不会变。 (2)不跟条件...
  • 表空间: Oracle的UNDOTBS01.DBF文件太大的解决办法 1、.禁止undo tablespace自动增长 alter database datafile 'full_path/undotbs01.dbf' autoextend off; 2.--
  • expdp/impdp 表空间模式迁移实施实验

    千次阅读 2011-05-18 20:29:00
    最近朋友问我关于表空间的迁移方案,今天我就做一实验,来为大家解答一下关于表空间的迁移方法。OS平台:windowsORACLE 版本:11.2.0实验目的:将测试表空间YY内的数据迁移到U1表空间内1:首先,我们来创建一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 261,289
精华内容 104,515
关键字:

一张表有两个表空间