[Oracle] Verhalten bei korruptem Index?

BaseBallBatBoy

Erfahrenes Mitglied
Hallo

Heute habe ich etwas seltsames entdeckt. Gegeben sei folgende Tabelle:

PK, OBJ, FK
========
1, x, 10
2, x, 20
3, x, 30
4, x, -1

Auf OBJ gibt es einen Index.

Wenn ich nun folgende Query absetze, erhalte ich nur die PKs 1-3!
SQL:
SELECT
   *
FROM 
   mytable
WHERE
   obj = 'x'

Wenn ich aber den Optimizer zwinge, den Index nicht zu verwenden, erhalte ich alle 4 Records!
SQL:
SELECT /*+ FULL(mytable) */ 
   *
FROM 
   mytable
WHERE
   obj = 'x'

Das bringt mich zu der Aussage, dass der Index korrupt ist. Seht ihr das auch so?

Nun habe ich auch eine nachgelagerte Prozedur, die ein Update auf diese Tabelle ausführt (UPDATE mytable WHERE obj = 'x' AND FK = -1). Sehe ich das richtig, dass dieser Update genau nichts bewirkt, weil er den Index verwendet und folglich den entsprechenden Eintrag gar nicht findet?

Gruss
 
Zuletzt bearbeitet von einem Moderator:
....
Wenn ich aber den Optimizer zwinge, den Index nicht zu verwenden, erhalte ich alle 4 Records!
.....
Das bringt mich zu der Aussage, dass der Index korrupt ist. Seht ihr das auch so?
...

--> Dann DROP den Index und erstelle ihn neu..


Nun habe ich auch eine nachgelagerte Prozedur, die ein Update auf diese Tabelle ausführt (UPDATE mytable WHERE obj = 'x' AND FK = -1). Sehe ich das richtig, dass dieser Update genau nichts bewirkt, weil er den Index verwendet und folglich den entsprechenden Eintrag gar nicht findet?

--> Was soll den geupdated werden ? So funktioniert es sowieso nicht, da du kein Attribut zum Updaten angegeben hast...
 
Danke für die Antwort. Also siehts du das ja auch so dass der Index hinüber ist, gut.

Ich denke ich habe inzwischen eine Idee was passiert ist: Die DBAs haben den Index deaktiviert, einen Bulk insert in die Tabelle gemacht (womit Duplikate bezüglich dem Unique Index entstanden sind) und dann den Index wieder Aktiviert.

Ich habe nun die Duplikate identifiziert und anschliessend haben die DBAs den Index Rebuild Online.

Ja da hast du schon recht, das war auch nur eine exemplarische update Query (aber der Vollständigkeit halber könnte man ja sagen dass in diesem Fall der FK auf 40 gesetzt werden soll). Ist ja eigentlich auch egal was man updated. Entscheidend ist, dass im where obj vorkommt und somit der Optimizer den Index verwenden wird. Da er aber dank des Index, wie oben gezeigt, nichts finden wird, kann auch gar nichts geupdated werden, das war der Punkt worauf ich hinaus wollte.

Anyway, ich denke ich habe es nun verstanden: 1. Duplikate eliminieren, 2. Index Rebuild, 3. Update sollte mit dem Index wieder funktionieren. Glaube das reicht mir soweit. Danke.
 

Neue Beiträge

Zurück