Oracle 11G – 插入时索引的性能影响
|
目的 验证插入没有PK /索引的记录加上后来创建的记录是否真的比插入PK /索引更快. 注意 环境 DELL Latitude核心i7 2.8GHz 8G内存和Windows上的Windows 7 64位SSD硬盘 背景 我被教导插入没有PK /索引的记录并在插入后创建它们比插入PK /索引更快. 然而,使用PK / Index的100万个记录插入实际上比创建PK / Index更快,大约4.5秒对6秒,下面的实验.通过将记录增加到300万(999000 – > 2999000),结果是相同的. 条件 >表DDL如下.数据和数据的一个bigfile表空间 要刷新的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 <----- Insert records with PK/Index
插入没有PK /索引的记录并在之后创建它们 TRUNCATE TABLE TBL2;
ALTER TABLE &TBL_NAME DROP CONSTRAINT PK_TBL2_COL1 CASCADE;
SET TIMING ON
INSERT INTO TBL2
SELECT i+j,(
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 rows inserted.
Elapsed: 00:00:03.454 <---- Insert without PK/Index
table TBL2 altered.
Elapsed: 00:00:02.544 <---- Create PK/Index
表DDL CREATE TABLE TBL2 (
"COL1" NUMBER,"COL2" VARCHAR2(100 BYTE),CONSTRAINT "PK_TBL2_COL1" PRIMARY KEY ("COL1")
) TABLESPACE "TBS_BIG" ;
解决方法确实,如果您不必修改一个或多个索引并且可能也执行约束检查,则修改表更快,但如果您必须添加这些索引,这也很大程度上无关紧要.您必须考虑对要实现的系统的完整更改,而不仅仅是其中的一部分.显然,如果要将一行添加到已包含数百万行的表中,那么删除和重建索引将是愚蠢的. 但是,即使你有一个完全空的表,你将要添加数百万行,但延迟索引到之后仍然会更慢. 原因是这样的插入最好用直接路径机制执行,当你使用直接路径插入到带有索引的表中时,会构建包含构建索引所需数据的临时段(数据加rowid) ).如果这些临时段比您刚加载的表小得多,那么它们扫描和构建索引的速度也会更快. 另一种方法是,如果表上有五个索引,则在加载它之后要进行五次全表扫描以构建索引. 显然这里涉及巨大的灰色区域,但做得很好: >质疑权威和一般经验法则,以及 编辑: 进一步的考虑因素 – 在删除索引时运行备份.现在,在紧急恢复之后,您必须有一个脚本来验证所有索引是否到位,当您让业务喘不过气来让系统重新启动时. 此外,如果您绝对决定在批量加载期间不维护索引,请不要删除索引 – 而是禁用它们.这样可以保留索引存在和定义的元数据,并允许更简单的重建过程.请注意,不要通过截断表意外重新启用索引,因为这将再次启用禁用的索引. (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


