创建索引oracle 很慢,Oracle 11G – 插入时索引的性能影响

该博客探讨了在Oracle 11G中,先插入数据再创建索引与直接插入带索引的数据哪个过程更快的问题。实验结果显示,尽管创建索引确实需要更多时间,但总体上先插入数据再创建索引并不比直接插入带索引的数据更快。博主在不同的数据量下进行了测试,得到了相似的结论,并提供了详细的实验步骤和DDL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

验证插入没有PK /索引的记录加上后来创建的记录是否真的比插入PK /索引更快.

注意

这里的要点不是索引需要更多时间(很明显),但总成本(不带索引的插入创建索引)高于(使用索引插入).因为我被教导插入没有索引并且稍后创建索引因为它应该更快.

环境

DELL Latitude核心i7 2.8GHz 8G内存和Windows上的Windows 7 64位SSD硬盘

Oracle 11G R2 64位

背景

我被教导插入没有PK /索引的记录并在插入后创建它们比插入PK /索引更快.

然而,使用PK / Index的100万个记录插入实际上比创建PK / Index更快,大约4.5秒对6秒,下面的实验.通过将记录增加到300万(999000 – > 2999000),结果是相同的.

条件

>表DDL如下.数据和数据的一个bigfile表空间

指数.

(测试了一个单独的索引表空间,具有相同的结果和较差的整体perforemace)

>每次运行前冲洗缓冲液/阀芯.

>每次运行实验3次并确保结果

很相似.

要刷新的SQL:

ALTER SYSTEM CHECKPOINT;

ALTER SYSTEM FLUSH SHARED_POOL;

ALTER SYSTEM FLUSH BUFFER_CACHE;

“插入PK /索引PK /索引后创建”比“插入PK /索引”更快吗?

我是否犯了错误或错过了实验中的某些条件?

插入PK /索引记录

TRUNCATE TABLE TBL2;

ALTER TABLE TBL2 DROP CONSTRAINT PK_TBL2_COL1 CASCADE;

ALTER TABLE TBL2 ADD CONSTRAINT PK_TBL2_COL1 PRIMARY KEY(COL1) ;

SET timing ON

INSERT INTO TBL2

SELECT i+j, rpad(TO_CHAR(i+j),100,'A')

FROM (

WITH DATA2(j) AS (

SELECT 0 j FROM DUAL

UNION ALL

SELECT j+1000 FROM DATA2 WHERE j < 999000

)

SELECT j FROM DATA2

),

(

WITH DATA1(i) AS (

SELECT 1 i FROM DUAL

UNION ALL

SELECT i+1 FROM DATA1 WHERE i < 1000

)

SELECT i FROM DATA1

);

commit;

1,000,000 rows inserted.

Elapsed: 00:00:04.328

插入没有PK /索引的记录并在之后创建它们

TRUNCATE TABLE TBL2;

ALTER TABLE &TBL_NAME DROP CONSTRAINT PK_TBL2_COL1 CASCADE;

SET TIMING ON

INSERT INTO TBL2

SELECT i+j, rpad(TO_CHAR(i+j),100,'A')

FROM (

WITH DATA2(j) AS (

SELECT 0 j FROM DUAL

UNION ALL

SELECT j+1000 FROM DATA2 WHERE j < 999000

)

SELECT j FROM DATA2

),

(

WITH DATA1(i) AS (

SELECT 1 i FROM DUAL

UNION ALL

SELECT i+1 FROM DATA1 WHERE i < 1000

)

SELECT i FROM DATA1

);

commit;

ALTER TABLE TBL2 ADD CONSTRAINT PK_TBL2_COL1 PRIMARY KEY(COL1) ;

1,000,000 rows inserted.

Elapsed: 00:00:03.454

table TBL2 altered.

Elapsed: 00:00:02.544

表DDL

CREATE TABLE TBL2 (

"COL1" NUMBER,

"COL2" VARCHAR2(100 BYTE),

CONSTRAINT "PK_TBL2_COL1" PRIMARY KEY ("COL1")

) TABLESPACE "TBS_BIG" ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值