【发布时间】:2015-07-02 03:12:15
【问题描述】:
目标
验证是否插入没有 PK/index 的记录加上稍后创建比插入 PK/Index 更快。
注意
这里的重点不是索引需要更多时间(很明显),而是总成本(Insert without index + create index)高于(Insert with index)。因为我被教导在没有索引的情况下插入并稍后创建索引,因为它应该更快。
环境
DELL Latitude core i7 2.8GHz 8G 内存和 SSD HDD 上的 Windows 7 64 位
Oracle 11G R2 64 位
背景
我被告知插入没有 PK/Index 的记录并在插入后创建它们会比使用 PK/Index 插入更快。
然而,使用 PK/Index 插入 100 万条记录实际上比稍后创建 PK/Index 快,大约 4.5 秒对 6 秒,下面的实验。通过将记录增加到 300 万条(999000 -> 2999000),结果是一样的。
条件
- DDL 表如下。一个用于数据和数据的大文件表空间
指数。
(测试了一个单独的索引表空间,结果相同,整体性能较差) - 每次运行前冲洗缓冲液/线轴。
- 每次运行 3 次实验并确保结果 是相似的。
要刷新的 SQL:
ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM FLUSH SHARED_POOL;
ALTER SYSTEM FLUSH BUFFER_CACHE;
问题
“在没有 PK/Index + PK/Index 创建之后插入”实际上是否比“使用 PK/Index 插入”更快?
我是否在实验中犯了错误或遗漏了某些条件?
使用 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/Index 的记录并在之后创建
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 <---- 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" ;
【问题讨论】:
-
@David Costa 如果你可以看看...
标签: oracle indexing insert database-performance oracle11gr2