Oracle 11G - Efeito de desempenho da indexação na inserção

Objetivo

Verifique se é verdade que a inserção de registros sem PK / índice e a criação posterior são mais rápidas do que a inserção com PK / Index.

Nota
O ponto aqui não é sobre indexação, leva mais tempo (é óbvio), mas o custo total (Inserir sem índice + criar índice) é maior que (Inserir com índice). Porque fui ensinado a inserir sem índice e criar o índice mais tarde, pois deve ser mais rápido.

Meio Ambiente

Windows 7 de 64 bits no DELL Latitude core i7 2.8GHz 8G de memória e SSD HDD
Oracle 11G R2 de 64 bits

fundo

Foi-me ensinado que inserir registros sem PK / Index e criá-los após a inserção seriam mais rápidos do que inserir com PK / Index.

No entanto, 1 milhão de inserções de registro com PK / Index foi realmente mais rápido do que criar PK / Index mais tarde, aproximadamente 4,5 segundos vs 6 segundos, com os experimentos abaixo. Ao aumentar os registros para 3 milhões (999000 -> 2999000), o resultado foi o mesmo.

CondiçõesA tabela DDL está abaixo. Um espaço de tabela de bigfile para dados e índice.
(Testou um espaço de tabela de índice separado com o mesmo resultado e uma composição geral inferior)Lave o buffer / spool antes de cada execução.Execute o experimento 3 vezes cada e verifique se os resultados foram semelhantes.

SQL para liberar:

ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM FLUSH SHARED_POOL;
ALTER SYSTEM FLUSH BUFFER_CACHE;
Pergunta, questão

Seria realmente verdade que "inserir sem criação de PK / Index + PK / Index posteriormente" é mais rápido que "inserir com PK / Index"?

Cometi erros ou perdi algumas condições no experimento?

Inserir registros com PK / Index
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
Insira registros sem PK / Index e crie-os após
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 da tabela
CREATE TABLE TBL2 (
    "COL1" NUMBER,
    "COL2" VARCHAR2(100 BYTE),
    CONSTRAINT "PK_TBL2_COL1" PRIMARY KEY ("COL1")
) TABLESPACE "TBS_BIG" ;

questionAnswers(3)

yourAnswerToTheQuestion