FK mit rdb$index_inactive = 3?

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
vr2
Beiträge: 79
Registriert: Fr 13. Apr 2018, 00:13

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
Benutzeravatar
martin.koeditz
Beiträge: 236
Registriert: Sa 31. Mär 2018, 14:35

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
Martin Köditz
it & synergy GmbH
vr2
Beiträge: 79
Registriert: Fr 13. Apr 2018, 00:13

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
Benutzeravatar
andi
Beiträge: 8
Registriert: Fr 13. Mär 2020, 16:26

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
Benutzeravatar
martin.koeditz
Beiträge: 236
Registriert: Sa 31. Mär 2018, 14:35

Hi Andi,

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

Gruß
Martin
Martin Köditz
it & synergy GmbH
vr2
Beiträge: 79
Registriert: Fr 13. Apr 2018, 00:13

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
bfuerchau
Beiträge: 199
Registriert: Mo 7. Mai 2018, 18:09

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.
vr2
Beiträge: 79
Registriert: Fr 13. Apr 2018, 00:13

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
Antworten