在创建表或索引时,我总是得到建议在查询中添加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;
答案 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