Index rebuild nur eine dummy-Funktion?

Folgender Fall: Eine Tabelle ist in einer Produktionsumgebung und einer Testumgebung angelegt. Im Produktionssystem sind 1,5Mio Zeilen enthalten, im Testsystem 150tsd. Im Produktionssystem werden alle Indizes wöchentlich per index rebuild neu aufgebaut und täglich analysiert(DBMS_STATSPACK).

Folgende Abfrage führt auf beiden Systemen zu unterschiedlichen Ausführungsplänen:

select count(*) from BDE_SORGFALT_QUALITAET
where SOQU_LAGER = 8
and SOQU_PNR = 298622
and SOQU_DATUM >= 20060301
and SOQU_DATUM < 20060331

-> auf LIVE: FULL TABLE SCAN
-> auf TEST: INDEX SCAN

1. Ansatz - Analysierung nicht mehr aktuell:
neues analysieren mit DBMS_STATSPACK

-> keine Änderung


2. Ansatz - fehlende "not null" Spalten:
alter table BDE_SORGFALT_QUALITAET modify SOQU_LAGER not null;
alter table BDE_SORGFALT_QUALITAET modify SOQU_PNR not null;
alter table BDE_SORGFALT_QUALITAET modify SOQU_DATUM not null;

-> gleiches Ergebnis


3. Ansatz - Index löschen und neu erstellen:
DROP INDEX BDE.BDE_SORGFALT_QUALITAET_IDX1;
CREATE INDEX BDE.BDE_SORGFALT_QUALITAET_IDX1 ON BDE.BDE_SORGFALT_QUALITAET
(SOQU_LAGER, SOQU_USER, SOQU_DATUM, SOQU_NRBEARB);

-> Index wird in beiden Systemen genutzt!

=> Fazit: Index rebuilt ist nur eine dummy-Funktion??? Besser löschen und neu erstellen der Indizes.


Aufbau der Tabelle:
CREATE TABLE BDE.BDE_SORGFALT_QUALITAET
(
SOQU_DATUM NUMBER(8) NOT NULL,
SOQU_LAGER NUMBER(2) NOT NULL,
SOQU_BEREICH NUMBER(2) NULL,
SOQU_BETRIEB NUMBER(2) NULL,
SOQU_ANLAGE NUMBER(2) NULL,
SOQU_ABTEILUNG NUMBER(2) NULL,
SOQU_GRUPPE NUMBER(2) NULL,
SOQU_SCHICHT NUMBER(1) NULL,
SOQU_PNR NUMBER(6) NOT NULL,
SOQU_QUAL_F_TKS4 VARCHAR2(4 BYTE) NULL,
SOQU_QUAL_M_TKS4 VARCHAR2(4 BYTE) NULL,
SOQU_Q_KZFART NUMBER(2) NULL,
SOQU_MENGE NUMBER(3) NULL,
SOQU_BEMERKUNG VARCHAR2(1000 BYTE) NULL,
SOQU_USER VARCHAR2(30 BYTE) NULL,
SOQU_CREATE_DATE DATE NULL,
SOQU_NRBEARB NUMBER(8) NULL,
SOQU_EB_FKANAL NUMBER(2) NULL,
SOQU_ZB_FKANAL NUMBER(2) NULL,
SOQU_ZB_FGRUND NUMBER(2) NULL,
SOQU_ZB_DATUM NUMBER NULL,
SOQU_MANR NUMBER(4) NULL,
SOQU_EB_UT NUMBER NULL,
SOQU_ZB_MANR NUMBER NULL
);
CREATE INDEX BDE.BDE_SORGFALT_QUALITAET_IDX1 ON BDE.BDE_SORGFALT_QUALITAET
(SOQU_LAGER, SOQU_USER, SOQU_DATUM, SOQU_NRBEARB);

Analysieren:
SYS.DBMS_STATS.GATHER_SCHEMA_STATS (
OwnName => 'BDE'
,Granularity => 'DEFAULT'
,Options => 'GATHER'
,Gather_Temp => FALSE
,Estimate_Percent => 10
,Block_sample => TRUE
,Method_Opt => 'FOR ALL INDEXED COLUMNS SIZE 1 '
,DEGREE => NULL
,CASCADE => TRUE
,StatID => v_tbl
,StatOwn => 'bde'
,StatTab => 'bde_OPTIMIZER_STATISTICS'
,No_Invalidate => FALSE);

Index rebuild:
-- einfache Indizes
for v_idx in c_idx loop
log(v_logID, v_logProc, 'Rebuild Index '|| v_idx.own ||'.'|| v_idx.name, 10);
execute immediate
'alter index '|| v_idx.own ||'.'|| v_idx.name ||' rebuild';
end loop;

-- partitionierte Indizes
for v_idx_part in c_idx_part loop
log(v_logID, v_logProc, 'Rebuild Index '|| v_idx_part.own ||'.'|| v_idx_part.idx ||' Partition: '|| v_idx_part.part, 10);
execute immediate
'alter index '|| v_idx_part.own ||'.'|| v_idx_part.idx ||' rebuild partition '|| v_idx_part.part;
end loop;

Kommentare

Beliebte Posts aus diesem Blog

PGA unter Oracle 11g

trunc(sysdate) - nette Spiele mit dem Datum

Datapump - Verzeichnis erstellen