【问题标题】:Using Index versus Create Index in oracle在 oracle 中使用索引与创建索引
【发布时间】:2016-01-22 07:07:02
【问题描述】:

我正在使用以下脚本创建一个表(我使用了使用索引)。

CREATE TABLE TABLE1 (
    C1 VARCHAR2(2 CHAR) NOT NULL ENABLE,
    C2 VARCHAR2(1 CHAR) NOT NULL ENABLE,
    CONSTRAINT TABLE_PK PRIMARY KEY (C1) USING INDEX TABLESPACE SFE_I1
)
TABLESPACE SFE_D1;

在上面的查询中索引会为什么列创建?

CREATE INDEX IDX_TABLE ON TABLE1 (C1) TABLESPACE SFE_I1;

如果我使用上述创建索引查询创建索引,它将为 C1 列创建索引。但是这两个脚本有什么区别。

如果我同时运行这个查询,应该会发生什么。建议的方法是什么?

如果我的创建表脚本包含复合主键并且我使用的是 USING INDEX 关键字,那么将如何创建索引(它会为所有复合列创建单个索引)

【问题讨论】:

    标签: sql oracle indexing ddl


    【解决方案1】:

    对于这个问题,create table 语句的重要部分是CONSTRAINT TABLE_PK PRIMARY KEY (C1) USING INDEX TABLESPACE SFE_I1。让我们分解并理解它:

    CONSTRAINT TABLE_PK
    

    您正在创建一个名为 table_pk 的约束。

    PRIMARY KEY
    

    这个约束是一个主键

    (C1)
    

    在专栏c1

    USING INDEX TABLESPACE SFE_I1
    

    一个主键,隐式需要创建一个索引,以便它可以有效地搜索会违反约束的重复项。与显式创建的索引(例如,您的第二条语句)一样,索引将在用户的默认表空间上创建,这并不总是最好的主意。 using index tablespace 语法允许您定义要使用的表空间,就像您在创建索引时可以使用它一样。

    如果您尝试运行 both 语句,第二个语句应该会失败,因为c1 已经被第一个语句索引了。

    【讨论】:

    • 如果上面帖子的First query中没有使用USING INDEX,会默认创建索引吗?如果是,我们如何查看索引?如果复合主创建使用索引,那么它是否会考虑所有涉及的复合列来创建索引。
    • 如果我想为非主键的列创建索引,那么应该满足所有条件(例如,如果该列能够产生重复值)
    • @Yoga 主键总是会创建一个与主键同名的索引。如果省略using index tablespace 子句,它将在默认表空间上创建。如果您有一个复合键,它将创建一个复合索引。您可以在具有重复值的列上创建索引。但是,如果您尝试创建 unique index,它将失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多