Oracle 创建索引

怎样建立最佳索引?

1、明确地创建索引

create index index_name on table_name(field_name)

tablespace tablespace_name

pctfree 5

initrans 2

maxtrans 255

storage

(

minextents 1

maxextents 16382

pctincrease 0

);

 

2、创建基于函数的索引

常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:

create index idx_func on emp(UPPER(ename)) tablespace tablespace_name;

 

3、创建位图索引

对基数较小,且基数相对稳定的列建立索引时,首先应该考虑位图索引,例:

create bitmap index idx_bitm on class (classno) tablespace tablespace_name;

 

4、明确地创建唯一索引

可以用create unique index语句来创建唯一索引,例:

create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;

 

5、创建与约束相关的索引

可以用using index字句,为与unique和primary key约束相关的索引,例:

alter table table_name

add constraint PK_primary_keyname primary key(field_name)

using index tablespace tablespace_name;

 

如何创建局部区索引?

1)基础表必须是分区表

2)分区数量与基础表相同

3)每个索引分区的子分区数量与相应的基础表分区相同

4)基础表的自分区中的行的索引项,被存储在该索引的相应的自分区中,例如

create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)

Pctfree 5

Tablespace TBS_AK01_IDX

Storage(

MaxExtents 32768

PctIncrease 0

FreeLists 1

FreeList Groups 1

)

local

/

 

如何创建范围分区的全局索引?

基础表可以是全局表和分区表

create index idx_start_date on tg_cdr01(start_date)

global partition by range(start_date)

(partition p01_idx vlaues less than ('0106')

partition p01_idx vlaues less than ('0111')

...

partition p01_idx vlaues less than ('0401'))

/

 

如何重建现存的索引?

重建现存的索引的当前时刻不会影响查询

重建索引可以删除额外的数据块

提高索引查询效率

alter index idx_name rebuild nologging;

对于分区索引

alter index idx_name rebuild partition partition_name nologging;

 

删除索引的原因?

1)不再需要的索引

2)索引没有针对其相关的表所发布的查询提供所期望的性能改善

3)应用没有用该索引来查询数据

4)该索引无效,必须在重建之前删除该索引

5)该索引已经变的太碎了,必须在重建之前删除该索引

语句:

drop index idx_name;

drop index idx_name partition partition_name;

 

建立索引的代价?

基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,

主要表现在CPU和I/O上。

插入、更新、删除数据产生大量db file sequential read锁等待。


### 如何在 Oracle 数据库中创建索引Oracle 数据库中,索引是一种用于加速查询操作的数据结构。合理地创建和维护索引可以显著提高数据库性能[^3]。 #### 创建索引的语法 以下是创建索引的标准 SQL 语法: ```sql CREATE INDEX index_name ON table_name (column1, column2, ...); ``` - `index_name` 是要创建索引名称。 - `table_name` 是目标表的名称。 - `(column1, column2, ...)` 表示要在哪些列上创建索引。 如果希望创建唯一索引,则可以在语句前加上 `UNIQUE` 关键字: ```sql CREATE UNIQUE INDEX index_name ON table_name (column1, column2, ...); ``` 此命令会强制指定列中的值必须唯一[^2]。 #### 注意事项 1. **选择合适的列**:通常建议在经常用于过滤条件(WHERE 子句)、连接条件(JOIN 子句)或排序操作(ORDER BY 子句)的列上创建索引[^1]。 2. **避免过度使用索引**:虽然索引能提升读取速度,但它也会增加写入操作的成本(如 INSERT、UPDATE 和 DELETE),因为每次修改数据都需要更新相应的索引树。 3. **定期优化索引**:随着数据的变化,某些索引可能变得低效甚至无用。应定期分析并调整索引策略。 #### 示例代码 假设有一个名为 `employees` 的表,其中有一列 `last_name` 经常被用来筛选员工信息。可以通过以下方式为其创建索引: ```sql CREATE INDEX idx_last_name ON employees(last_name); ``` 如果需要确保该列的值不重复,可改为创建唯一索引: ```sql CREATE UNIQUE INDEX uidx_last_name ON employees(last_name); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值