Oracle 11G - Leistungseffekt der Indizierung bei Einfügung
Ü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.
Windows 7 64 Bit auf DELL Latitude Core i7 2.8GHz 8G Speicher & SSD HDD
Oracle 11G R2 64 Bit
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;
FragWä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ügTRUNCATE 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 @ erstellTRUNCATE 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 DDLCREATE TABLE TBL2 (
"COL1" NUMBER,
"COL2" VARCHAR2(100 BYTE),
CONSTRAINT "PK_TBL2_COL1" PRIMARY KEY ("COL1")
) TABLESPACE "TBS_BIG" ;