Seite 1 von 1

FK mit rdb$index_inactive = 3?

Verfasst: Mi 6. Mai 2020, 04:26
von vr2
Hallo allerseits,

vielleicht steht es in irgendeiner Doku, dass inaktive FKs immer 3 sind, aber laut dieser hier gibt es den Zustand gar nicht: https://firebirdsql.org/file/documentat ... dices.html.

Ist das das normale inactive bei FKs? Und überhaupt, wie kommt es dazu, dass ein FK inactive sein kann?

Grüße, Volker

Re: FK mit rdb$index_inactive = 3?

Verfasst: Mi 6. Mai 2020, 16:24
von martin.koeditz
Hallo Volker,

wo hast du denn den Wert her? Ich habe keine DB mit rdb$index_inactive = 3 gefunden. Tatsächlich sind nur 0 und 1 zulässig.

Gruß
Martin

Re: FK mit rdb$index_inactive = 3?

Verfasst: Do 7. Mai 2020, 03:23
von vr2
Hi Martin,

aus einer meiner Firebird 2.5-DBs. Steht so in den system tables. Hab ich da garantiert nicht reingeschrieben, auch wenn das bei 2.5 noch geht.

Grüße, Volker

Re: FK mit rdb$index_inactive = 3?

Verfasst: Do 7. Mai 2020, 14:25
von andi
Hallo Volker,

der Wert 3 bedeutet inaktiver "Foreign Key" -> Google ist Dein Freund. ;-)
https://ib-aid.com/en/articles/ibanalys ... nd-tricks/
Gleich im ersten Kapitel beschrieben.

Gruß
Andi

Re: FK mit rdb$index_inactive = 3?

Verfasst: Do 7. Mai 2020, 21:04
von martin.koeditz
Hi Andi,

danke für die Info. Spannend, da die Referenz klar was anderes erzählt.

Gruß
Martin

Re: FK mit rdb$index_inactive = 3?

Verfasst: Sa 9. Mai 2020, 19:44
von vr2
Hi Andi,
andi hat geschrieben: Do 7. Mai 2020, 14:25 der Wert 3 bedeutet inaktiver "Foreign Key" -> Google ist Dein Freund. ;-)
Vielen Danke für den Hinweis, Google war hier eher ein wenig hilfreicher entfernter Bekannter ;-)
Klar, kenne die Leute von ibsurgeon von Konferenzen sogar persönlich und was die machen, egal.

Bei Indizes auf Constraints geht bis Firebird 2.5 also ein herzhaftes

Code: Alles auswählen

update rdb$indices 
set rdb$index_inactive = 3
where ...
zum Deaktivieren und

Code: Alles auswählen

update rdb$indices 
set rdb$index_inactive = 0
where ...
zum Aktivieren / in Kombi mit vorherigem Deaktivieren das Neubauen des Index.

@Martin: Das wär was für die Doku, die ist an der Stelle falsch/unvollständig.

Und die offene Frage, durch was ein FK inactive wird, wenn nicht von außen eine 3 in die rdb$indices geschrieben wurde?

Grüße, Volker

Re: FK mit rdb$index_inactive = 3?

Verfasst: So 10. Mai 2020, 00:02
von bfuerchau
Nö, das geht auch anders:
https://firebirdsql.org/file/documentat ... dx-altridx

alter index myindex active;
alter index myindex inactive;

Beim ETL hat sich das schon vielfach bewährt alle nicht benötigten indizes zu deaktivieren und hinterher wieder zu aktivieren.
Da schafft man plötzlich bis zu 5000 Inserts/sekunde statt nur 30 (ja nach Anzahl Felder und indizes).
Das Aufbauen der Indizes geht dann auch wieder sehr schnell.

Re: FK mit rdb$index_inactive = 3?

Verfasst: So 10. Mai 2020, 21:13
von vr2
Kann ich nicht reproduzieren. Ich nehme einen FK-Index tab1_fk2, mache

Code: Alles auswählen

alter index tab1_fk2 inactive
und bekomme wie erwartet

This operation is not defined for system tables.unsuccessful metadata update.
MODIFY RDB$INDICES failed.
action cancelled by trigger (2) to preserve data integrity.
Cannot deactivate index used by an integrity constraint.

mache ich hingegen

Code: Alles auswählen

update rdb$indices 
set rdb$index_inactive = 3
where rdb$index_name = 'TAB1_FK2'
geht das durch und hat anschließend rdb$index_inactive = 3.

Die Doku sagt, FKs lassen sich nicht mit alter index ... inactive deaktivieren. Kann ich bestätigen und ist normalerweise auch nicht sinnvoll. Auch die zweite Feststellung, man könne die Selektivität auch eines constraints (zb FKs) mit alter index ... active neu berechnen, kommt hin. Aber alter index ... inactive führt zu Fehlermeldung bei FK.

Insofern sind die Beispiele in der Doku an der Stelle etwas irrreführend, an dem alter index ... inactive sollte dranstehen: (nicht bei Constraint Indizes).

Grüße, Volker