PL / SQL创建带索引的表

时间:2017-06-14 10:48:04

标签: oracle plsql

我有以下PL / SQL代码:

    DROP TABLE TAB_PARAM;

BEGIN
   EXECUTE IMMEDIATE 'CREATE TABLE TAB_PARAM
  (
     TABLE_OWNER  VARCHAR2(30) NOT NULL,
     TABLE_NAME   VARCHAR2(30) NOT NULL,
     COLUMN_NAME  VARCHAR2(30) NOT NULL,
     PATTERN VARCHAR2(1024),
     TYPE_METHODE VARCHAR2(30) NOT NULL,
     SEPARATEUR VARCHAR2(20),
     ID VARCHAR2(30),
    CONSTRAINT PK_TAB_PARAM PRIMARY KEY (TABLE_OWNER,TABLE_NAME,COLUMN_NAME) USING INDEX TABLESPACE IND_PARC_256M NOLOGGING
  )
  TABLESPACE TAB_PARC_256M NOLOGGING NOCACHE NOMONITORING NOPARALLEL';

commit;
END;
/

我不理解这部分:

CONSTRAINT PK_TAB_PARAM PRIMARY KEY (TABLE_OWNER,TABLE_NAME,COLUMN_NAME) USING INDEX TABLESPACE IND_PARC_256M NOLOGGING

也不是部分:

TABLESPACE TAB_PARC_256M NOLOGGING NOCACHE NOMONITORING NOPARALLEL';

我知道它将ID设置为TAB_PARAM的主键,但后来我没有得到索引部分。 任何人都可以帮我理解这段代码吗?

3 个答案:

答案 0 :(得分:2)

对于主键oracle隐式在表的表空间中创建唯一索引。 这部分USING INDEX TABLESPACE允许我们为这个隐式索引指示表空间。

NOLOGGING - 使用最少的日志记录修改数据(标记新的扩展区无效并记录字典更改)。

NOCACHE - Oracle不会在缓冲区缓存中存储块。

NOPARALLEL - 此表不允许并行执行。(默认值)

NOMONITORING - 禁用统计信息收集。现在已弃用。还有其他机制来收集统计数据

答案 1 :(得分:1)

有时你可以用一次性方式创建一个表,例如你需要从文件中通过sqlloader读取数据并插入表中,之后你将从表中选择所有记录。此操作不需要索引,也不需要主键。无论如何,在创建表时创建主键始终是好的,Oracle将为您创建索引。您可以随时创建更多索引,因为表已创建。现在假设您想要在不是主键的字段上使用 where 条件更新表,那么可以更好地决定在该字段上创建索引。此外,当您创建索引或表时,您可以关联表空间(之前创建),并且可以很好地实现表和索引的单独表空间。所有这些操作都是DDL声明。在Oracle中,您可以使用这些查询select * from dba_data_files; select * from dba_tables; select * from dba_indexes;

检查数据文件,表和索引

答案 2 :(得分:0)

编辑。来自oracle doc

  

如果Oracle数据库在强制执行主键约束之前包含一组唯一值,则它会使用现有索引。现有的   index可以定义为唯一或非唯一。当DML操作是   执行后,使用此现有约束强制执行主键约束   索引。

如果已有索引命中pk列,oracle将使用它,否则Oracle Database会生成唯一索引。

所以你可以在oracle中创建一个没有索引的主键,如果那些列已经有索引,那么指定索引就是性能问题。表中索引的目的是更快地“读取”数据。

来自oracle document

  

索引是一个架构对象,它包含每个值的条目   出现在表或集群的索引列中并提供   直接,快速访问行。

对于TABLESPACE,它是数据库对象所在的位置,因此在创建表时,您可以指定要在哪个表空间中存在。在这里阅读更多oracle document

对于NOLOGGING NOCACHE NOMONITORING,所以表不能登录重做日志或缓存,也与性能问题有关。

相关问题