Oracle 11G - Efeito de desempenho da indexação na inserção
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.
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
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ãoSeria 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 / IndexTRUNCATE 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ósTRUNCATE 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 tabelaCREATE TABLE TBL2 (
"COL1" NUMBER,
"COL2" VARCHAR2(100 BYTE),
CONSTRAINT "PK_TBL2_COL1" PRIMARY KEY ("COL1")
) TABLESPACE "TBS_BIG" ;