【问题标题】:Index on (col1, col2) and Index on (col2, col1)(col1, col2) 上的索引和 (col2, col1) 上的索引
【发布时间】:2016-08-12 19:43:33
【问题描述】:

1/在表格中,index I1 on T(col1, col2)index I2 on T(col2, col1) 有何不同?我们可以同时创建吗?以Unique Index为例。

Index Skip Scanning 似乎表明列顺序很重要,这意味着 I1 可能与 I2 不同。

在另一篇文章中,我看到了

CREATE TABLE INVOICES
(ID NUMBER(11),
INVOICE_DATE DATE,
CONSTRAINT UN_ID UNIQUE(ID, DATE) USING INDEX(CREATE INDEX I_INVOICES ON INVOICES(ID, INVOICE_DATE)),
CONSTRAINT UN_DATE UNIQUE(DATE, ID) USING INDEX I_INVOICES);

表示Unique constraints (col1, col2)(col2, col1) 使用相同的index (col1, col2)

大家的一些见解?我的问题不是关于 当我们选择一个而不是另一个?

但是关于它们何时共存 它们是两个不同的索引/对象吗?顺序重要吗?为什么该示例对两者都使用相同的索引?因为顺序很重要,除了 (col1, col2) 之外创建另一个索引 (col2, col1) 会更好吗?

2/ 关于同一个问题:为什么我们只使用 CREATE INDEX 而不是 CREATE UNIQUE INDEX ?在什么情况下我们使用CREATE UNIQUE INDEX

【问题讨论】:

  • 在创建任何索引之前,您应该知道如何使用它。所以您需要知道: 1. 哪些查询将针对您的表运行; 2. 数据的基数以及哪一列的基数更高/更低。等等然后你就可以决定你需要什么索引:col1col2上的普通/压缩索引和((col1, col2)上的unique index(col2, col1)上的(col2, col1)

标签: oracle indexing oracle11g oracle10g table-index


【解决方案1】:

复合索引的排序键

按照以下指南对复合索引中的键进行排序:

创建索引,以便 WHERE 子句中使用的键构成前导部分。 如果在 WHERE 子句中更频繁地使用某些键,那么请务必创建索引,以便更频繁地选择的键构成前导部分,以允许仅使用这些键的语句使用索引。 如果所有键在 WHERE 子句中的使用频率相同,那么在 CREATE INDEX 语句中将这些键从选择性最高到选择性最低的顺序排列可以最好地提高查询性能。 如果所有键在 WHERE 子句中的使用频率相同,但数据在其中一个键上进行物理排序,则将该键放在复合索引中的第一个位置。

来自:https://docs.oracle.com/cd/B10501_01/server.920/a96533/data_acc.htm#2174

2/ 关于同一个问题:为什么我们只使用 CREATE INDEX 而不是 CREATE UNIQUE INDEX ?在什么情况下我们使用 CREATE UNIQUE INDEX ?

表示索引列中的值组合必须是唯一的。

来自:http://www.techonthenet.com/oracle/indexes.php

请注意:如果您要在表上创建唯一键,那么也会自动创建唯一索引

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多