Oracle 11G - Leistungseffekt der Indizierung bei Einfügung

Zielsetzun

Überprüfen Sie, ob das Einfügen von Datensätzen ohne PK / Index und das spätere Erstellen von Datensätzen schneller ist als das Einfügen mit PK / Index.

Hinwei
Der Punkt hier ist nicht über die Indizierung dauert länger (es ist offensichtlich), aber die Gesamtkosten (Einfügen ohne Index + Index erstellen) ist höher als (Einfügen mit Index). Weil ich gelernt habe, ohne Index einzufügen und später einen Index zu erstellen, wie es schneller sein sollte.

Umgebun

Windows 7 64 Bit auf DELL Latitude Core i7 2.8GHz 8G Speicher & SSD HDD
Oracle 11G R2 64 Bit

Hintergrun

Ich habe gelernt, dass das Einfügen von Datensätzen ohne PK / Index und das Erstellen nach dem Einfügen schneller ist als das Einfügen mit PK / Index.

Aber 1 Million Einfügungen mit PK / Index waren tatsächlich schneller als das spätere Erstellen von PK / Index, etwa 4,5 Sekunden gegenüber 6 Sekunden, mit den folgenden Experimenten. Durch Erhöhen der Datensätze auf 3 Millionen (999000 -> 2999000) wurde das gleiche Ergebnis erzielt.

Bedingunge Die Tabelle DDL ist unten. Ein Bigfile-Tabellenbereich für Daten und Index.
(Getestet ein separates Index Tablespace mit dem gleichen Ergebnis und insgesamt schlechter Perforemace)Spülen Sie den Puffer / die Spule vor jedem Lauf. Führen Sie das Experiment dreimal durch und stellen Sie sicher, dass die Ergebnisse ähnlich sind.

SQL zu spülen:

ALTER SYSTEM CHECKPOINT;
ALTER SYSTEM FLUSH SHARED_POOL;
ALTER SYSTEM FLUSH BUFFER_CACHE;
Frag

Wäre es tatsächlich wahr, dass "Ohne PK / Index einfügen + PK / Index später erstellen" schneller ist als "Mit PK / Index einfügen"?

Habe ich Fehler gemacht oder einige Bedingungen im Experiment verpasst?

Datensätze mit PK / Index @ einfüg
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
Datensätze ohne PK / Index einfügen und nach @ erstell
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
Table DDL
CREATE TABLE TBL2 (
    "COL1" NUMBER,
    "COL2" VARCHAR2(100 BYTE),
    CONSTRAINT "PK_TBL2_COL1" PRIMARY KEY ("COL1")
) TABLESPACE "TBS_BIG" ;

Antworten auf die Frage(6)

Ihre Antwort auf die Frage