我有以下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的主键,但后来我没有得到索引部分。 任何人都可以帮我理解这段代码吗?
答案 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中创建一个没有索引的主键,如果那些列已经有索引,那么指定索引就是性能问题。表中索引的目的是更快地“读取”数据。
索引是一个架构对象,它包含每个值的条目 出现在表或集群的索引列中并提供 直接,快速访问行。
对于TABLESPACE,它是数据库对象所在的位置,因此在创建表时,您可以指定要在哪个表空间中存在。在这里阅读更多oracle document
对于NOLOGGING NOCACHE NOMONITORING,所以表不能登录重做日志或缓存,也与性能问题有关。