暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 我可以在复合主键上创建索引吗?

askTom 2018-02-26
321

问题描述

你好,先生,

我有一个表管理器,它有4列。其中3列是复合主键。
创建表管理器 (ID整数,名称varchar(20),名称varchar(20),工资整数);

alter table manager添加约束t_pk主键 (ID,名称,指定);

所以,我的问题是
1) 是否会默认在复合主键上创建索引 (默认情况下)?
2) 如果需要在第一列ID上创建索引,可以在复合主键上创建单个索引吗?

提前谢谢你。

专家解答

默认情况下,您将获得与主键中的列匹配的索引。

另一个好处是,对前导列的查询仍然可以从该索引中受益。

SQL> select     index_name,column_name
  2  from       user_ind_columns
  3  where      table_name = 'T'
  4  order by index_name,column_position;

INDEX_NAME                     COLUMN_NAME
------------------------------ ------------------------------
SYS_C0060960                   OBJECT_NAME
SYS_C0060960                   OWNER
SYS_C0060960                   OBJECT_ID

3 rows selected.

SQL>
SQL> set autotrace traceonly explain
SQL> select * from t where object_name = 'X' and owner = 'Y' and object_id = 123;

Execution Plan
----------------------------------------------------------
Plan hash value: 366573511

--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |              |     1 |   132 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T            |     1 |   132 |     3   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | SYS_C0060960 |     1 |       |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_NAME"='X' AND "OWNER"='Y' AND "OBJECT_ID"=123)

SQL>
SQL> select * from t where object_name = 'X' and owner = 'Y';

Execution Plan
----------------------------------------------------------
Plan hash value: 147527283

----------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |              |     1 |   132 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T            |     1 |   132 |     4   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | SYS_C0060960 |     1 |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_NAME"='X' AND "OWNER"='Y')

SQL>
SQL> select * from t where object_name = 'X';

Execution Plan
----------------------------------------------------------
Plan hash value: 147527283

----------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |              |     1 |   132 |     4   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T            |     1 |   132 |     4   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | SYS_C0060960 |     1 |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("OBJECT_NAME"='X')
复制


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论