如果在oracle中创建表或索引时不添加表空间子句,将会有什么重大影响?

时间:2019-07-03 23:32:37

标签: oracle indexing tablespace

在创建表或索引时,我总是得到建议在查询中添加tablespace子句。如果我们在创建表时不使用tablespace子句,对我们的表会有什么重大影响?

这是我很长时间以来一直在做的事情。

CREATE TABLE XT_PMB_NOTIFY_UNSUB( 
TXNID NUMBER(15), 
APP_SEQNO NUMBER(15), 
PRIMARY_KEYVAL VARCHAR2(4000) NOT NULL, 
OP_CODE VARCHAR2(15), 
TXN_STATUS VARCHAR2(1), 
CREATE_DT DATE, 
PRIMARY KEY (TXNID) ); 

来自DBA的推荐。

CREATE TABLE XT_PMB_NOTIFY_UNSUB( 
TXNID NUMBER(15), 
APP_SEQNO NUMBER(15), 
PRIMARY_KEYVAL VARCHAR2(4000) NOT NULL, 
OP_CODE VARCHAR2(15), 
TXN_STATUS VARCHAR2(1), 
CREATE_DT DATE, 
PRIMARY KEY (TXNID) )
TABLESPACE DATA_ENC_TS;

2 个答案:

答案 0 :(得分:5)

答案是取决于您的公司如何定义其表空间规则。

Oracle用户(或模式)可以具有一个“默认表空间”,您可以通过查询数据库来查看它:

select username, default_tablespace from dba_users;

,或者如果您对此没有权限,并且只想了解当前用户的权限,则为:

select username, default_tablespace from user_users;

或者也许这个可以查看当前连接的用户可见的所有用户:

select username, default_tablespace from user_users;

根据Oracle文档(https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_8003.htm),这意味着什么:

  

为用户创建的对象指定默认表空间。如果   您省略此子句,然后将用户的对象存储在   数据库默认表空间。如果没有默认表空间   指定数据库,然后将用户的对象存储在   SYSTEM表空间。

因此,出于您的意图和目的,创建表时最后不显式使用表空间时,通常它将转到用户的默认表空间。如果您的DBA倾向于不定义默认表空间,那么它将开始产生更严重的影响,因为该表将存储在全局默认表空间中,或者(禁止使用天堂)它将进入SYSTEM表空间。最后一个选择将对数据库的运行状况极为不利。

一些公司习惯为表和索引分配不同的表空间。在这种情况下,用户只能有一个默认表空间,并且如果在create index(或create table)语句中省略了tablespace子句,则对象将进入错误的表空间。

由于表或索引位于错误的表空间中的后果。表空间是一个或多个物理操作系统文件的集合(Oracle将它们称为数据文件)。每当在表空间中创建表或索引时,oracle都会在该数据文件中分配空间,Oracle将该空间称为段。段是数据文件中的逻辑单元。请记住,Oracle进一步将段细分为较小的逻辑单元,称为扩展区和块,但这超出了此处的主题。如果您有兴趣,可以在这里阅读更多内容:https://docs.oracle.com/cd/B19306_01/server.102/b14220/logical.htm

让我们回到细分市场。段存在于属于表空间的数据文件中。当您将对象放入表空间并将其移至其他表空间时,Oracle需要物理写入OS上的文件。如果表为空,这可能很简单;如果涉及跨多个数据文件或包含千兆字节或TB级数据的海量表,则可能需要做大量工作。这可能意味着需要修复应用程序。

Oracle提供了某些方法来避免这些情况下的应用程序中断,例如,在线重新定义(软件包DBMS_REDEFINITION)。但我希望我们可以同意,可以更好地利用它们的应用程序迁移和类似的事情。

在许多情况下,使用默认表空间设置在任何情况下都可以,但是,如果您允许的话,Oracle的许多经验法则是,您可以编写代码来明确地执行某些操作而不依赖于默认值,为您自己和您的DBA争取帮助。总的来说,依赖它的灵活性甚至会偶而使自己面对意外,然后负责清理它。

答案 1 :(得分:3)

如果不指定表空间,Oracle将使用分配给模式的默认表空间。您可以通过以下查询找到默认表空间。除非您有一个很小的开发数据库而没有很多模式,否则可能没问题,但是否则,最好明确定义它们。

 select *
    from database_properties
    where property_name like 'DEFAULT%TABLESPACE';

PROPERTY_NAME                  PROPERTY_VALUE       DESCRIPTION
------------------------------ -------------------- ----------------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP                 Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE   USERS                Name of default permanent tablespace