目的
验证插入没有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" ;