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

1 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) ); 
Run Code Online (Sandbox Code Playgroud)

来自的建议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;
Run Code Online (Sandbox Code Playgroud)

Fra*_*tja 5

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

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

select username, default_tablespace from dba_users;
Run Code Online (Sandbox Code Playgroud)

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

select username, default_tablespace from user_users;
Run Code Online (Sandbox Code Playgroud)

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

select username, default_tablespace from user_users;
Run Code Online (Sandbox Code Playgroud)

根据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提供了某些方法来避免这些情况下的应用程序中断,例如Online Redefinition(软件包DBMS_REDEFINITION)。但是我希望我们可以同意,可以更好地利用它们的用法来进行应用程序迁移和类似的事情。

在所有情况下,使用默认表空间设置在任何情况下都可以,但是,如果您允许的话,Oracle的许多经验法则是,您可以编写代码来显式地执行某些操作,而不是依赖于默认值,自己动手做,您的DBA的青睐。总的来说,依赖它的灵活性甚至会偶而使自己面对一个惊喜,然后负责清理它。