Funktionsweise Index

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

Moderator: thorben.braun

Antworten
Iceboone
Beiträge: 4
Registriert: Di 14. Jul 2020, 15:27

Mi 26. Aug 2020, 10:46

Hallo,

ich habe folgendes Skript.

Ich habe in einer Datenbank einen Fehler eingebaut.

Ich habe jetzt zwei Möglichkeiten.

In dem Verwaltungsprogramm wird ein historischer Vertrag angelegt, wenn man Änderungen vornimmt. Jetzt möchte ich das rückgängig machen, dafür müsste ich den Datensatz mit über 100 Spalten einlesen und neu erstellen. Deshalb bin ich folgenden Weg gegangen. Ich nehme die eindeutige ID des historischen Eintrags und den des aktuellen und tausche sie einfach.

Es sieht super aus in der Datenbank.

Jetzt öffne ich den Vertrag und beim öffnen scheint er die Detailmaske nicht zu finden und mein Eintrag verschwindet irreversibel aus der Datenbank und es wird ein neuer leerer Datensatz erzeugt.


Jetzt schaue ich in den DDL und wurschtel mich durch die Auslöser und stosse auf:

CREATE INDEX VT_KFZ1 ON VT_KFZ (AMSIDNR);
CREATE INDEX VT_KFZ2 ON VT_KFZ ("KEY");

Also komme ich zu dem Entschluss, ich nehme den Tausch vor, ändere aber nichts im Index. Wie kann ich das machen? Ich habe ein DBEAVER und weiß gar nicht wo ich den Index finde. Der Index wird ja wohl zur schnellen Auffindbarkeit angelegt, aber ich weiß nicht wie ich den Tausch von zwei Einträgen im Index korrekt eintrage.

Könnt Ihr mir helfen?

Da ich Indizes in Verbindung mit SQL nicht kenne, wäre es total nett, wenn noch Infos fehlen, mir zu sagen was Ihr noch benötigt, um mir zu helfen.

Gruß Volker
Benutzeravatar
martin.koeditz
Beiträge: 220
Registriert: Sa 31. Mär 2018, 14:35

Do 27. Aug 2020, 10:13

Hallo Volker,

Indizes werden zum schnellen Auffinden von Datensätzen genutzt. Soweit korrekt.
Constraints (Primär- und Fremdschlüssel, Unique Keys...) nutzen ebenfalls Indizes.

Ein manuell erstellter Index sagt zunächst nur aus, dass hier ein Hash-Wert zum schnellen Auffinden von Datensätzen gebildet wird. Das heißt aber nicht, dass dieser eindeutig ist.

Code: Alles auswählen

VT_KFZ1 ON VT_KFZ (AMSIDNR);
Hier wird der Index VZ_KFZ1 für das Feld AMSIDNR in der Tabelle VT_KFZ erstellt. Wenn du nun eine Suche auf diesem Feld durchführst, wird der Index verwendet. Andernfalls würde Firebird die Daten nacheinander von der Platte lesen.

In deinem Fall liegt der Index also vor, die AMSIDNR ist dadurch jedoch nicht vor Mehrdeutigkeiten geschützt. Es kann n Datensätze mit der AMSIDNR 12345 geben.

Wenn du uns die Tabellenstruktur zeigst, können wir sicherlich helfen.

Gruß
Martin
Martin Köditz
it & synergy GmbH
Antworten