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
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